Программа, сгенерированная CMake, не может связать в Windows: пытается связать с несуществующим файлом - PullRequest
0 голосов
/ 03 июля 2018

Я пытаюсь скомпилировать очень простую тестовую программу для 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 голосов
/ 03 июля 2018

Заголовки Boost содержат команды компоновщика в Windows, поэтому библиотеки Boost связываются автоматически при включении соответствующего заголовка. Однако, похоже, что ваша установка использует другую схему именования для библиотек, что делает их не связанными.

Вы можете отключить функцию автоматического связывания Boost, определив макрос препроцессора BOOST_ALL_NO_LIB. Как это:

target_compile_definitions(windows-test PRIVATE BOOST_ALL_NO_LIB)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...