c++ - 如何将 vcpkg boost 与 MinGW 链接
问题描述
我有一个在 VS 2017 社区下运行良好的代码。现在我不能再使用它了,我不得不切换到 MinGW。
我用 MinGW 编译了 boost 库,然后我使用生成的库来链接我的程序:
- Lib/libboost_program_options-mgw81-mt-d-x64-1_69.a(静态调试库)
- Lib/libboost_program_options-mgw81-mt-x64-1_69.a(静态发布库)
这是我正在使用的命令:
g++.exe -DNDEBUG -DASCII -Wall -std=c++17 -static-libgcc -static-libstdc++ -L lib -o prog.exe *.o -lboost_program_options-mgw81-mt-x64-1_69
这就是我得到的:
main.o:main.cpp:(.text+0x203): undefined reference to `__imp__ZN5boost15program_optionslsERSoRKNS0_19options_descriptionE'
main.o:main.cpp:(.text+0x3f9): undefined reference to `__imp__ZN5boost15program_options19options_description21m_default_line_lengthE'
main.o:main.cpp:(.text+0x406): undefined reference to `__imp__ZN5boost15program_options19options_description21m_default_line_lengthE'
... (more lines like these)
所有未定义的引用错误仅与boost::program_options
调用有关(但我没有使用任何其他 boost 库)。
我努力了:
- 使用 MinGW 构建 Boost 源代码并链接到生成的静态库。
- 使用我的计算机上的 boost(.lib 和 .DLL)和 vcpkg。
所有尝试都给出了相同的错误。
我怎样才能解决这个问题 ?
环境
gcc 8.1.0
boost 1.69
Windows 10 17134
解决方案
问题:
似乎 vcpkg (${vcpkgRoot}/installed/x64-static/include) 中包含的标头不适用于 MinGW。
原始命令g++.exe -DNDEBUG -I'c:/vcpkg/installed/x64-windows-static/include' -L . main.cpp -lboost_program_options-vc140-mt
不起作用。这里我使用生成的 boost_program_options-vc140-mt.lib 文件和带有 vcpkg 的头文件。
我尝试使用 MinGW 构建 Boost 并使用 .a 文件:g++.exe -DNDEBUG -I'c:/vcpkg/installed/x64-windows-static/include' -L . main.cpp -lboost_program_options-mgw81-mt-x64-1_69
也没有工作。
但是这个命令有效g++.exe -DNDEBUG -I'c:/boost-mingw/boost_1_69_0' -L . .\main.cpp -lboost_program_options-mgw81-mt-x64-1_69
所以这意味着标题特定于 Visual Studio ..
推荐阅读
- ssis - 面临执行 Sql 任务的问题
- ironworker - 证书已过期 [CERT_HAS_EXPIRED]
- excel - 循环复制具有特定数据的整行并粘贴到下一行
- python - Python 正则表达式在数字后无法匹配
- pandas - 如何使用 pandas UDF 在 pyspark 中计算 Welch PSD?
- python - 有没有办法通过在同一行中输入数字来在 python 中添加数字?
- magento2 - Magento2:在 ExportButton 组件上显示弹出窗口
- c# - WPF Extended Toolkit DateTimePicker 始终重置为 DateTime.Now 当输入任何不正确的 DateTime 格式值时
- java - 在 JNI Android 的 C++ 中使用 memset 时检测到堆栈损坏
- ios - 从 Android 手机上传的音频文件无法在 iOS 中播放