我使用Microsoft Visual Studio 2015 Community Edition构建了一个C++应用程序.我正在使用Advanced Installer来确保Visual Studio 2015的Visual C++ Redistributable是先决条件.
但是,可再发行的安装程序并不完美.我的一些用户报告说可再发行安装程序挂起,或者说它无法安装,然后用户得到"此程序无法启动,因为您的计算机缺少MSVCP140.dll"错误.
根据微软的说法,我现在可以将可再发行的DLL与我的应用程序一起打包,尽管他们不推荐它:
若要部署可再发行的Visual C++文件,可以使用Visual Studio中包含的Visual C++ Redistributable Packages(VCRedist_x86.exe,VCRedist_x64.exe或VCRedist_arm.exe)....也可以在应用程序本地文件夹中直接安装可再发行的Visual C++ DLL,该文件夹是包含可执行应用程序文件的文件夹.出于维修原因,我们不建议您使用此安装位置.
有4个文件C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\redist\x64\Microsoft.VC140.CRT.这是否意味着我只需要在安装过程中将它们复制到我的应用程序目录中?
这样可以吗?我需要出示许可证吗?为什么没有更多人这样做而不需要再次预安装可再发行组件?
一直在玩cython.通常用Python编程,但在前一生中使用过C. 我无法弄清楚如何制作一个独立的可执行文件.
我已经下载了cython,我可以创建一个.pyx文件(这只是一个扩展名为.pyx的普通Python文件),它在Python shell中执行,使用:import pyximport; pyximport.install()
我可以在命令行生成一个.c文件:cython file.pyx我可以通过构建标准的setup.py来生成一个.so文件并执行:
setup.py build_ext --inplace
Run Code Online (Sandbox Code Playgroud)
我尝试使用带有各种选项的gcc从.so文件中创建一个可执行文件,但总是有大量丢失的文件,标题等.尝试过从几乎所有地方指向标题,但没有成功,并且我并不熟悉所有gcc选项的功能,或者即使我应该使用gcc.
我在这里断开了事实,我可以在Python shell中运行我的程序,但不是在命令行,(我不希望用户必须进入shell,导入模块等).
我在这里错过了什么?
我无法获得已编译的 python 脚本所看到的其他可用模块。我需要如何更改以下流程才能接受基于 venv 的模块或全局模块?
脚步:
$ python3 -m venv sometest
$ cd sometest
$ . bin/activate
(sometest) $ pip3 install PyCrypto Cython
Run Code Online (Sandbox Code Playgroud)
使用非标准模块的基本脚本Crypto:
# hello.py
from Crypto.Cipher import AES
import base64
obj = AES.new('This is a key123', AES.MODE_CBC, 'This is an IV456')
msg = "The answer is no"
ciphertext = obj.encrypt(msg)
print(msg)
print(base64.b64encode(ciphertext))
Run Code Online (Sandbox Code Playgroud)
(sometest) $ python3 hello.py
The answer is no
b'1oONZCFWVJKqYEEF4JuL8Q=='
Run Code Online (Sandbox Code Playgroud)
编译它:
(sometest) $ cython -3 --embed hello.py
(sometest) $ gcc -Os -I /usr/include/python3.5m -o hello …Run Code Online (Sandbox Code Playgroud) 我正在尝试将 python 脚本转换为 Cython 可执行二进制文件。它还使用其他模块,如 Tensorflow、pandas、numpy、matplotlib、seaborn 和 pickle。这是我的编译命令。
cython --embed -o foo.c foo.pyx
gcc -Os -o FOOEXE foo.c -I /usr/include/python3.6m/ -L/workdirectory/somePythonEnviroment-venv/lib -lpython3.6m -lpthread -lm -lutil -ldl
我用 pip 下载了所有必需的模块,并将其作为 python 脚本运行就可以了。当我使用 cython magic 将其编译为 C 二进制文件时。它说的第一件事
import pandas as pd 没有名为“pandas”的模块
我同意这一点。我曾假设它也会编译所有包含的模块并将其放入二进制文件中。如何包含 pandas 模块?如何将使用 pip 安装的任何 python 模块包含到 cython 项目中。cython 是否仅适用于 python.h 中的基本 Python 代码和库?我需要原始的 python 模块文件和可执行文件吗?
我有一个C++程序,它有一些插件结构:当程序启动时,它在插件文件夹中查找带有某些导出函数签名的dll,例如:
void InitPlugin(FuncTable* funcTable);
Run Code Online (Sandbox Code Playgroud)
然后程序将调用dll中的函数来初始化并将函数指针传递给dll.从那时起,dll可以与程序通信.
我知道Cython允许你在Python中调用C函数,但我不确定我是否可以编写一个Cython代码并将其编译为dll,这样我的C++程序就可以用它进行初始化.一个示例代码会很棒.
我已经成功地在 Linux 上构建了一些使用 MinGW 进行 Python 扩展所必需的 DLL。沿着这些思路:
from setuptools.command.build_py import build_py
class BuildGo(build_py):
def run(self):
if # need to build windows binaries
self.build_win()
build_py.run(self)
def build_win(self):
if # compilers and toolchain available
try:
# builds extra libraries necessary for this extension
except subprocess.CalledProcessError as e:
print(e.stderr)
raise
try:
result = subprocess.check_output([
'x86_64-w64-mingw32-gcc-win32',
'-shared',
'-pthread',
'-o',
EXTRA_DLL,
FAKE_WIN_BINDINGS,
ARCHIVE_GENERATED_IN_PREVIOUS_STEP,
'-lwinmm',
'-lntdll',
'-lws2_32',
])
print(result)
except subprocess.CalledProcessError as e:
print(e.stderr)
raise
Run Code Online (Sandbox Code Playgroud)
我现在希望我可以避免build_ext以同样痛苦的方式进行扩展,让它为 Windows 交叉编译 Cython 代码...我研究了“和”setuptools的优雅相互作用的深渊,在深渊有机会看到之前回到我身上...是否有一种方法可以只指定一些标志...例如所需平台的编译器名称和Python二进制文件...它就可以做到这一点?distutils …
假设我正在“cythonizing”这个test.py:
import json
print(json.dumps({'key': 'hello world'}))
Run Code Online (Sandbox Code Playgroud)
和:
cython test.py --embed
call "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" x64
cl test.c /I C:\Python37\include /link C:\Python37\libs\python37.lib
Run Code Online (Sandbox Code Playgroud)
正如分发嵌入 Cython 编译的代码并使其在任何机器上工作所需的最小文件集中提到的,有必要沿着文件分发python37.dll和vcruntime140.dll的内容Lib\(作为Lib\或打包到 a 中python37.zip)test.exe。
问题:如何修改cl.exe ...命令来要求编译器静态链接python37.dll到文件vcruntime140.dll内部test.exe?
(这样就不再需要运输python37.dll和单独)vcruntime140.dll
cython ×6
python ×6
dll ×3
c++ ×2
cl ×1
compilation ×1
executable ×1
module ×1
packages ×1
pandas ×1
plugins ×1
visual-c++ ×1
windows ×1