【问题标题】:Compile C++ on Windows在 Windows 上编译 C++
【发布时间】:2021-08-16 10:16:36
【问题描述】:

我正在尝试在 Windows 上编译 C++。 在Linux上编译需要的命令是:

g++ -O3 -Wall -shared -std=c++11 -fPIC `python -m pybind11 --includes` EO_functions_bipartite.cpp -o extremal_bi.so

我安装了 MinGW,但是当我尝试编译时出现以下错误:

g++.exe: error: python: No such file or directory
g++.exe: error: pybind11: No such file or directory
g++.exe: error: unrecognized command line option '-m'
g++.exe: error: unrecognized command line option '--includes EO_functions_bipartite.cpp'
g++.exe: fatal error: no input files
compilation terminated.

【问题讨论】:

  • 有些工具和库你好像没有安装。

标签: c++ linux windows mingw


【解决方案1】:

假设你的路径中有 python。

在 g++ 中嵌入 python -m pybind11 --includes 命令的反引号转义在 Windows 中的 cmd.exe 上不起作用。

在 cmd shell 的单独行上运行 python -m pybind11 --includes 命令。获取该命令的输出并替换为 g++ 命令。应该是一堆-I包含参数。

那么如果python命令的输出是这样的:

-IC:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.7_3.7.2544.0_x64__qbz5n2kfra8p0\Include -IC:\Users\User\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.7_qbz5n2kfra8p0\LocalCache\local-packages\Python37\site-packages\pybind11\include

将您的 g++ 命令扩展为:

g++ -O3 -Wall -shared -std=c++11 -fPIC "-IC:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.7_3.7.2544.0_x64__qbz5n2kfra8p0\Include" -IC:\Users\User\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.7_qbz5n2kfra8p0\LocalCache\local-packages\Python37\site-packages\pybind11\include EO_functions_bipartite.cpp -o extremal_bi.so

请注意我在第一个包含目录周围加上的引号,因为它的路径中有一个空格。

【讨论】:

  • 这是我得到的:-IC:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.7_3.7.2544.0_x64__qbz5n2kfra8p0\Include -IC:\Users\User\AppData\Local\Packages\PythonSoftwareFoundation .Python.3.7_qbz5n2kfra8p0\LocalCache\local-packages\Python37\site-packages\pybind11\include 我现在该怎么办?
  • @Dario - 已更新答案以向您展示如何执行此操作。
【解决方案2】:

如果您有 Linux 背景,在本机 Windows 上启动的最简单方法是使用 MinGW-w64 安装 MSYS2 shell。这将提供一个实际的bash,允许您以几乎与在 Linux 上完全相同的方式运行命令,包括支持反引号,就像您的问题一样。

虽然我总是建议使用 $( ... ) 而不是反引号,因为这样可以嵌套。

请注意,MinGW-w64 也存在于 Windows 上,以允许从 Linux 交叉构建 Windows,但如果您以前从未做过任何交叉构建,这可能会有点困难。

您的命令中的-shared ... -o extremal_bi.so 也应替换为-shared ... -o extremal_bi.dll -Wl,--out-implib,libextremal_bi.dll.a,因为Windows 上不存在.so 文件,因为Windows 使用.dll 文件作为共享库,编译器使用.dll.a 文件作为库对象他们。

最后,在 Windows 上,您需要通过编写 libextremal_bi.def 来告诉编译器或链接器您将要导出哪些符号链接命令,或者在定义这些符号时使用__declspec(dllexport)/__declspec(dllimport),这可能有点复杂,因为它需要一些条件定义来确定代码是否正在为 Windows 编译以及是否在共享的实际构建过程中库 (__declspec(dllexport)) 或使用它的代码 (__declspec(dllimport))。还有另一种导出所有符号的方法,但这是一种肮脏的方法,可能更容易导致符号冲突。

【讨论】:

    猜你喜欢
    • 2020-08-31
    • 1970-01-01
    • 2011-12-05
    • 2021-04-21
    • 2014-03-19
    • 1970-01-01
    • 2021-03-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多