升压日志链接错误(CMake的MINGW32)
我有这个cmake的文件:升压日志链接错误(CMake的MINGW32)
cmake_minimum_required(VERSION 3.6)
find_package(Boost 1.54.0 REQUIRED COMPONENTS log)
add_executable(TestProject main.cpp)
target_include_directories(TestProject PUBLIC ${Boost_INCLUDE_DIRS})
target_link_libraries(TestProject Boost::log)
add_definitions("-DBOOST_ALL_NO_LIB") # Disable boost auto-linking.
add_definitions("-DBOOST_LOG_DYN_LINK") # Avoid linking errors with boost::log
如果我建立它使用Visual Studio作为从Visual-Studio的开发者控制台我产生,我可以建立就好了。但是在我的MinGW32环境中,我收到链接器错误。我可以确认boost是安装在我的mingw32环境中的,并且对于其他项目(使用其他boost组件)的工作良好。
[email protected] MINGW32 ~/src/testproj/buildmsys
$ tree /mingw32 -f | grep libboost_log
│ ├── /mingw32/bin/libboost_log_setup-mt.dll
│ ├── /mingw32/bin/libboost_log-mt.dll
│ ├── /mingw32/lib/libboost_log_setup-mt.a
│ ├── /mingw32/lib/libboost_log_setup-mt.dll.a
│ ├── /mingw32/lib/libboost_log-mt.a
│ ├── /mingw32/lib/libboost_log-mt.dll.a
我构建具有:
$ mkdir buildmsys && cd buildmsys
$ cmake .. -GNinja
$ cmake --build .
这里是输出
[email protected] MINGW32 ~/src/TestProject/buildmsys
$ cmake .. -GNinja
-- Boost version: 1.63.0
-- Found the following Boost libraries:
-- log
-- date_time
-- log_setup
-- system
-- filesystem
-- thread
-- regex
-- chrono
-- atomic
-- Configuring done
-- Generating done
-- Build files have been written to:
C:/msys64/home/stewart/src/TestProject/buildmsys
[email protected] MINGW32 ~/src/TestProject/buildmsys
$ cmake --build .
[1/1] Linking CXX executable TestProject.exe
FAILED: TestProject.exe
cmd.exe /C "cd . && C:\msys64\mingw32\bin\c++.exe CMakeFiles/TestProject.dir/main.cpp.obj -o TestProject.exe -Wl,--major-image-version,0,--minor-image-version,0 C:/msys64/mingw32/lib/libboost_log-mt.dll.a C:/msys64/mingw32/lib/libboost_log_setup-mt.dll.a C:/msys64/mingw32/lib/libboost_filesystem-mt.dll.a C:/msys64/mingw32/lib/libboost_thread-mt.dll.a C:/msys64/mingw32/lib/libboost_date_time-mt.dll.a C:/msys64/mingw32/lib/libboost_regex-mt.dll.a C:/msys64/mingw32/lib/libboost_chrono-mt.dll.a C:/msys64/mingw32/lib/libboost_system-mt.dll.a C:/msys64/mingw32/lib/libboost_atomic-mt.dll.a -lkernel32 -luser32 -lgdi32 -lwinspool -lshell32 -lole32 -loleaut32 -luuid -lcomdlg32 -ladvapi32 && cd ."
CMakeFiles/TestProject.dir/main.cpp.obj:main.cpp:(.text+0x151): undefined reference to `_imp___ZN5boost3log9v2_mt_nt64core3getEv'
CMakeFiles/TestProject.dir/main.cpp.obj:main.cpp:(.text+0x2b5): undefined reference to `_imp___ZN5boost3log9v2_mt_nt64core10set_filterERKNS1_6filterE'
CMakeFiles/TestProject.dir/main.cpp.obj:main.cpp:(.text+0x35a): undefined reference to `_imp___ZN5boost3log9v2_mt_nt64core3getEv'
CMakeFiles/TestProject.dir/main.cpp.obj:main.cpp:(.text+0x4e2): undefined reference to `_imp___ZN5boost3log9v2_mt_nt64core10set_filterERKNS1_6filterE'
CMakeFiles/TestProject.dir/main.cpp.obj:main.cpp:(.text+0x53c): undefined reference to `_imp___ZN5boost3log9v2_mt_nt67trivial6logger3getEv'
CMakeFiles/TestProject.dir/main.cpp.obj:main.cpp:(.text+0x5a2): undefined reference to `_imp___ZN5boost3log9v2_mt_nt67trivial6logger3getEv'
CMakeFiles/TestProject.dir/main.cpp.obj:main.cpp:(.text$_ZN5boost3log9v2_mt_nt614attribute_nameC1EPKc[__ZN5boost3log9v2_mt_nt614attribute_nameC1EPKc]+0x10): undefined reference to `_imp___ZN5boost3log9v2_mt_nt614attribute_name18get_id_from_stringEPKc'
CMakeFiles/TestProject.dir/main.cpp.obj:main.cpp:(.text$_ZNK5boost3log9v2_mt_nt615value_extractorINS1_7trivial14severity_levelENS1_16fallback_to_noneENS3_3tag8severityEEclERKNS1_14attribute_nameERKNS1_19attribute_value_setE[__ZNK5boost3log9v2_mt_nt615value_extractorINS1_7trivial14severity_levelENS1_16fallback_to_noneENS3_3tag8severityEEclERKNS1_14attribute_nameERKNS1_19attribute_value_setE]+0x19): undefined reference to `_imp___ZNK5boost3log9v2_mt_nt619attribute_value_set4findENS1_14attribute_nameE'
CMakeFiles/TestProject.dir/main.cpp.obj:main.cpp:(.text$_ZNK5boost3log9v2_mt_nt615value_extractorINS1_7trivial14severity_levelENS1_16fallback_to_noneENS3_3tag8severityEEclERKNS1_14attribute_nameERKNS1_19attribute_value_setE[__ZNK5boost3log9v2_mt_nt615value_extractorINS1_7trivial14severity_levelENS1_16fallback_to_noneENS3_3tag8severityEEclERKNS1_14attribute_nameERKNS1_19attribute_value_setE]+0x2e): undefined reference to `_imp___ZNK5boost3log9v2_mt_nt619attribute_value_set3endEv'
CMakeFiles/TestProject.dir/main.cpp.obj:main.cpp:(.text$_ZNK5boost3log9v2_mt_nt615value_extractorINS1_7trivial14severity_levelENS1_16fallback_to_noneENS3_3tag8severityEEclERKNS1_14attribute_nameERKNS1_19attribute_value_setE[__ZNK5boost3log9v2_mt_nt615value_extractorINS1_7trivial14severity_levelENS1_16fallback_to_noneENS3_3tag8severityEEclERKNS1_14attribute_nameERKNS1_19attribute_value_setE]+0xe0): undefined reference to `_imp___ZN5boost3log9v2_mt_nt63aux26attach_attribute_name_infoERNS_9exceptionERKNS1_14attribute_nameE'
collect2.exe: error: ld returned 1 exit status
ninja: build stopped: subcommand failed.
这有什么错我的设置?
注:我已经检查(并试图)的情况下,这些链接我的问题是重复的:
Mingw32 Boost Log Link Errors: InterlockedCompareExchange(移民问题)
boost log link error 2019(BOOST_LOG_DYN_LINK问题)
- Boost-log linker error(Unicode issue)
- link error with boost log(Unicode issue)
- Visual Studio 2013 Boost-log v1_61_0 linking errors(升压安装问题)
如果我把这些解决方案,使用Unicode是唯一一个我没有得到工作。我已经将add_definitions("-Zc:wchar_t")
添加到我的Cmake文件中,但是我从C++。exe中得到了无法识别的命令行选项错误(因为该标志是VS特定的)。
该问题很可能是由于代码与Boost.Log之间的目标Windows版本不匹配造成的。看到这个答案:
Problems Linking boost log 1_60 with MinGw on Windows 7
最有可能的,项目中的某处定义_WIN32_WINNT
到0x0600
或更高的值。
由MinGW编译时,Boost默认为Windows XP,因为MinGW提供的Windows SDK太不完整。
这就是问题所在。 '#define _WIN32_WINNT 0x0600'确实在代码中。你是如何将我的问题与这个原因联系起来的? – Stewart
您可以在缺少的符号中看到版本命名空间为'v2_mt_nt6',这意味着您的代码已针对Vista或更高版本进行编译。请参阅http://www.boost.org/doc/libs/1_64_0/libs/log/doc/html/log/rationale/namespace_mangling.html。 MinGW Windows SDK的问题我只知道,因为我有这些。 –
体验一下!我正在慢慢获得更多,我感谢您的帮助。 – Stewart
'我可以证实boost是安装在我的mingw32环境中,并且对其他项目运行良好。 - 你可以为其他项目(使用Boost)和**比较**的编译行与由CMake的? – Tsyvarev