Я собрал три библиотеки повышения (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