我试图在Windows上编译一个非常简单的测试程序,并不断出现链接器错误。链接程序如下:
#include <boost/asio/io_context.hpp>
int main()
{
boost::asio::io_context context;
}
虽然CMakeLists.txt看起来像这样:
cmake_minimum_required(VERSION 3.10 FATAL_ERROR)
project(windows-test)
SET(CMAKE_CXX_STANDARD 17)
find_package(Boost 1.6.7 COMPONENTS system)
include_directories("${Boost_INCLUDE_DIRS}")
add_executable(windows-test main.cpp)
target_link_libraries(windows-test Boost::system)
使用nmake构建此文件时,它失败,并显示以下输出:
-- Boost version: 1.67.0
-- Found the following Boost libraries:
-- system
-- Configuring done
-- Generating done
-- Build files have been written to: Z:/windows-test/build
[ 50%] Linking CXX executable windows-test.exe
LINK Pass 1: command "C:\PROGRA~2\MICROS~1\2017\BUILDT~1\VC\Tools\MSVC\1414~1.264\bin\Hostx64\x64\link.exe /nologo @CMakeFiles\windows-test.dir\objects1.rsp /out:windows-test.exe /implib:windows-test.lib /pdb:Z:\windows-test\build\windows-test.pdb /version:0.0 /machine:x64 /debug /INCREMENTAL /subsystem:console C:\local\boost_1_67_0\lib64-msvc-14.1\boost_system-vc141-mt-gd-x64-1_67.lib kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib /MANIFEST /MANIFESTFILE:CMakeFiles\windows-test.dir/intermediate.manifest CMakeFiles\windows-test.dir/manifest.res" failed (exit code 1104) with the following output:
LINK : fatal error LNK1104: cannot open file 'libboost_system-vc141-mt-gd-x64-1_67.lib'
NMAKE : fatal error U1077: '"C:\Program Files\CMake\bin\cmake.exe"' : return code '0xffffffff'
Stop.
NMAKE : fatal error U1077: '"C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\VC\Tools\MSVC\14.14.26428\bin\HostX64\x64\nmake.exe"' : return code '0x2'
Stop.
NMAKE : fatal error U1077: '"C:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\VC\Tools\MSVC\14.14.26428\bin\HostX64\x64\nmake.exe"' : return code '0x2'
Stop.
文件'libboost_system-vc141-mt-gd-x64-1_67.lib'确实在系统上不存在,但是我不知道它来自哪里,因为它没有出现在链接器命令中它正在执行。链接器命令显示文件C:\ local \ boost_1_67_0 \ lib64-msvc-14.1 \ boost_system-vc141-mt-gd-x64-1_67.lib确实存在。
为什么它为什么尝试链接到丢失的文件,而该文件在链接器命令中却没有显示?我在这里感觉不尽如人意,因为我已经有近20年没有使用Windows的经历了,而且从来没有移植过它。
答案 0 :(得分:1)
Boost标头包含Windows上的链接器命令,以便在包含适当的标头时自动链接Boost库。但是,似乎您的设置为库使用了不同的命名方案,这使得这些库无法链接。
您可以通过定义预处理器宏BOOST_ALL_NO_LIB
来禁用Boost自动链接功能。像这样:
target_compile_definitions(windows-test PRIVATE BOOST_ALL_NO_LIB)