BOOST_ROOT не соблюдается на этапе соединения после конфигурации cmake - PullRequest
0 голосов
/ 15 января 2019

Извиняюсь за длинное название.

Я борюсь за связывание 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

Ответы [ 2 ]

0 голосов
/ 05 февраля 2019

После входа в cmake-developer список рассылки и, наконец, оставив сообщение о проблемах cmake gitlab Я понял, что проблема была не столько в моей версии cmake, сколько в моей cmake_minimum_required, которую я унаследовал от старый проект.

Я устанавливал:

cmake_minium_required(VERSION 2.8)

После обновления до 3.12, я получил правильное поведение:

/path/to/g++ -rdynamic CMakeFiles/test.dir/test.cpp.o -o test -lboost_program_options-mt

Чтение cmake_minimum_required документы Я понял, что "команда неявно вызывает" cmake_policy. Я считаю, что последний не играл хорошо с FindBoost из моего 3.12 `cmake.

Я не уверен, полезен ли этот пост для SO, но я определенно усвоил здесь урок по cmake.

0 голосов
/ 04 февраля 2019

Я не знаю, какую версию CMake вы используете, но вы пытались использовать Boost import target вместо устаревшей переменной CMake:

т.е. заменить: target_link_libraries(test LINK_PUBLIC ${Boost_PROGRAM_OPTIONS_LIBRARY}) от target_link_libraries(test LINK_PUBLIC Boost::program_options)

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