CMake меняет имя библиотеки на Windows при добавлении с помощью target_link_libraries - PullRequest
0 голосов
/ 14 апреля 2020

Я собрал три библиотеки повышения (stati c) на Windows и с помощью инструмента сборки ninja . Я запускаю всю сборку (cmake и ninja) с терминала x64 Native Tools Command Prompt For VS 2017

Я пытаюсь создать фиктивный исполняемый файл с cmake, связывающимся с этими библиотеки, но когда я target_link_libraries их (используя полный путь) cmake жалуется на то, что библиотека не может быть найдена, но она ищет неправильное имя. Позвольте мне объяснить:

Я делаю: target_link_libraries(dummy C:\Users\Me\lib\libboost_filesystem.lib)

и получаю ошибку

cannot open file 'libboost_program_options-vc141-mt-gd-x64-1_70.lib'

, поэтому кажется, что cmake имеет добавил несколько суффиксов к имени библиотеки. Эти суффиксы генерируются сборщиком boost, но я использовал layout=system, чтобы избежать их.

РЕДАКТИРОВАТЬ: Я попытался передать -DCMAKE_BUILD_TYPE=Release аргументам cmake, и я получил ту же ошибку, но на этот раз имя библиотеки libboost_program_options-vc141-mt-x64-1_70.lib. Похоже, что в зависимости от типа сборки cmake меняется имя библиотеки. Как мне избежать / исправить это?

Ниже приведены полные исходные файлы:

Команда повышения сборки

.\bootstrap.bat --prefix=some_prefix --with-libraries=system,filesystem,program_options
.\b2.exe variant=debug address-model=64 architecture=x86 -q -d0 --layout=system --with-system --with-program_options --with-filesystem link=static runtime-link=static --abbreviate-paths --prefix=%1 -j 12 install

PD. Я использую все эти опции сборки boost, потому что хочу построить его в другом дереве сборки cmake и хочу, чтобы библиотеки имели фиксированное простое имя, чтобы иметь возможность добавлять их в BYPRODUCTS.

Cmake-файл фиктивного проекта

cmake_minimum_required(VERSION 3.9.0)

project(Test)

add_executable(dummy_test ${CMAKE_SOURCE_DIR}/dummy_test.cpp)

target_link_libraries(dummy_test
    PRIVATE
        C:/Users/me/boost/lib/libboost_program_options.lib
        C:/Users/me/boost/lib/libboost_filesystem.lib
        C:/Users/me/boost/lib/libboost_system.lib
)

target_include_directories(dummy_test
    PRIVATE
        C:/Users/me/boost/include
)

dummy_test. cpp

#include <boost/program_options.hpp>

namespace po = boost::program_options;

int main()
{
  po::options_description commands("Commands");
  return 29;
}

РЕДАКТИРОВАТЬ

У меня есть попытался создать библиотеки boost, позволяющие b2 генерировать нужные имена (например, libboost_program_options-vc141-mt-s-x64-1_70.lib).

Я изменил файл cmake, чтобы настроить его для этих новых библиотек. Теперь я получаю ошибку:

error LNK2038: mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2' in dummy_test.cpp.obj

среди других.

Команда сборки boost теперь: .\b2.exe -q -d0 --with-system --with-program_options --with-filesystem link=static runtime-link=static --abbreviate-paths --prefix=some_prefix -j 12 install

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...