CMake生成的程序无法在Windows上链接:尝试链接到不存在的文件

时间:2018-07-03 08:42:51

标签: c++ windows boost cmake

我试图在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的经历了,而且从来没有移植过它。

1 个答案:

答案 0 :(得分:1)

Boost标头包含Windows上的链接器命令,以便在包含适当的标头时自动链接Boost库。但是,似乎您的设置为库使用了不同的命名方案,这使得这些库无法链接。

您可以通过定义预处理器宏BOOST_ALL_NO_LIB来禁用Boost自动链接功能。像这样:

target_compile_definitions(windows-test PRIVATE BOOST_ALL_NO_LIB)