Извиняюсь за длинное название.
Я борюсь за связывание boost с cmake
из-за наличия библиотек boost в каталоге /usr/lib64
. Мой импульс скомпилирован в другом месте, и я указываю cmake
с BOOST_ROOT
. Сознавая потенциальные проблемы, я устанавливаю минимальную версию и Boost_NO_SYSTEM_PATH
. Этап настройки работает нормально, но при связывании я получаю сообщение об ошибке:
test.cpp:(.text._ZN5boost15program_options25basic_command_line_parserIcEC2EiPKPKc[_ZN5boost15program_options25basic_command_line_parserIcEC5EiPKPKc]+0xa8): undefined reference to `boost::program_options::detail::cmdline::cmdline(std::vector<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char>
>, std::allocator<std::__cxx11::basic_string<char,std::char_traits<char>, std::allocator<char> > > > const&)'
Это явно проблема выбора неправильной библиотеки, и с помощью make VERBOSE=2
я вижу, что строка g++
не соответствует моей ранее найденной настройке усиления в BOOST_ROOT
g++ CMakeFiles/test.dir/test.cpp.o -o test -rdynamic -lboost_program_options-mt
Но я бы ожидал чего-то такого:
g++ ... -L/path/to/my/own/boost/lib -lboost_program_options-mt
В качестве шага «отладки» я печатаю сообщение в cmake
с Boost_LIBRARY_DIRS
и вижу /path/to/my/own/boost/lib
. Когда я «вручную» добавляю флаг -L
, связь работает, и я знаю, что системные библиотеки все еще мешают работе. Кроме того, мои *LIBRARY_PATH
указывают только на /path/to/my/own/boost/lib
.
Возможно, не исключено, что это ошибка модуля FindBoost
, но мне трудно в это поверить. Мне кажется, что в cmake есть еще что-то главное, чего я не понимаю? Почему в этом случае не генерируется флаг -L
или ссылка на определенный файл? Пожалуйста, сообщите.
Вот мой CMakeLists.txt
cmake_minimum_required(VERSION 2.8)
set(Boost_NO_SYSTEM_PATHS ON)
find_package(Boost 1.67.0 REQUIRED COMPONENTS program_options)
include_directories(${Boost_INCLUDE_DIR})
add_executable(test test.cpp)
target_link_libraries(test LINK_PUBLIC ${Boost_PROGRAM_OPTIONS_LIBRARY})
И моя программа:
#include <iostream>
#include <string>
#include <boost/program_options.hpp>
namespace po=boost::program_options;
int main( int argc, char* argv[])
{
po::options_description options_description;
po::positional_options_description positional_options_description;
po::variables_map variables_map;
options_description.add_options()
("help,h", "print usage message");
po::store(po::command_line_parser(argc, argv).options(
options_description).positional(positional_options_description).run(),
variables_map);
return 0;
}
Другие соответствующие выходные данные
Я использую message
, чтобы извлечь варажи из шага конфигурации cmake
после find_package
:
${Boost_INCLUDE_DIR} /path/to/my/own/boost/include
${Boost_LIBRARY_DIRS} /path/to/my/own/boost/lib
${Boost_LIBRARIES} /path/to/my/own/boost/lib/libboost_program_options-mt.so
${Boost_PROGRAM_OPTIONS_LIBRARY} /path/to/my/own/boost/lib/libboost_program_options-mt.so