неопределенная ссылка на YAML::LoadFile

Я пытаюсь использовать новую версию libyaml-cpp и у меня проблемы с компоновщиком (undefined reference to 'YAML::LoadFile(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)').

Я собираю библиотеку следующим образом:

cmake -DBUILD_SHARED_LIBS=ON ..
make
sudo make install

Потом включаю yaml-cpp/yaml.h и вызываю YAML::LoadFile( some_string );. Моя строка компиляции:

g++ -L/usr/local/lib -I/usr/local/include -lyaml-cpp -std=c++0x -o $@  $^

Я также пытался поместить туда точный файл .so, но безуспешно. Используя nm, я вижу функцию LoadFile в общей библиотеке. Я не могу понять, то ли я каким-то образом использую неправильную строку сборки, то ли что-то не так с библиотекой.


person edA-qa mort-ora-y    schedule 03.03.2014    source источник


Ответы (5)


Это проблема заказа в командной строке. Думаю, я просто никогда не пойму логику командной строки GCC. Простое размещение библиотеки в конце, кажется, работает:

g++ -L/usr/local/lib -I/usr/local/include -std=c++0x -o $@  $^ -lyaml-cpp
person edA-qa mort-ora-y    schedule 03.03.2014

Поддержка нового API yaml-cpp.

find_package(PkgConfig)
pkg_check_modules(YAMLCPP REQUIRED yaml-cpp>=0.5)
include_directories(${YAMLCPP_INCLUDE_DIRS})

add_executable(name src/name.cpp)
target_link_libraries(name ${catkin_LIBRARIES}  ${YAMLCPP_LIBRARIES})
person Sinaí Aranda    schedule 27.05.2019
comment
Не могли бы вы объяснить, какова функция/цель этих шагов, чтобы люди, которые к ним подходят, могли их легче понять? - person DrGodCarl; 27.05.2019

Я исправил проблему, настроив CMakeList.txt

У меня не было проблем со сборкой, как указано выше:

 g++ -L/usr/local/lib -I/usr/local/include -std=c++0x main.cpp -lyaml-cpp

Но использование cmake и сборка через CLion мне не помогли.

Этот CMakeList.txt исправил это для меня (это всего лишь минимальная урезанная версия, но она должна дать представление). Предполагается, что в вашей системе установлена ​​только одна версия yaml-cpp:

# Projekt Description / etc
cmake_minimum_required(VERSION 3.14)
project(yaml_cpp)
set(CMAKE_CXX_STANDARD 14)

# Declaration of package required
find_package(PkgConfig)
pkg_check_modules(YAMLCPP REQUIRED yaml-cpp>=0.5)

# Define the executable and link the yaml libs
add_executable(yaml_cpp main.cpp)
target_link_libraries(yaml_cpp ${YAMLCPP_LIBRARIES})

Это был самый минималистичный способ заставить вещи работать. Меня вдохновил приведенный выше пример Sinaí Aranda.

person LeTigre    schedule 03.08.2019

У вас тоже установлена ​​старая версия библиотеки? Возможно, gcc сначала ищет эту версию и не рассматривает новую.

person Jesse Beder    schedule 03.03.2014
comment
Да, у меня тоже есть старый, но я не могу его удалить (он нужен для других вещей). Вот почему я, хотя и указал явный путь и/или имя библиотеки, сначала загрузил бы новый. - person edA-qa mort-ora-y; 03.03.2014
comment
И находит. Если я поставлю -l:libyaml-cpp.so.0.5, он не жалуется на отсутствие файла, но все равно не находит ссылки. - person edA-qa mort-ora-y; 03.03.2014

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

Использование OSX El Capitan с новыми версиями XCode (7.3) и CLang (Apple LLVM версии 7.3.0 (clang-703.0.29) Использование yaml-cpp 0.5.3

Что я сделал, чтобы заставить его работать:

  1. Получите FindYamlCpp.cmake из интернета. Сохраните его в /usr/local/share/cmake/Modules.
  2. Установите CMakeFiles.txt, чтобы найти Yaml-cpp

    # YAML with yaml-cpp
    SET(YAMLCPP_STATIC_LIBRARY TRUE)
    FIND_PACKAGE(YamlCpp)
    IF(YamlCpp_FOUND)
        MESSAGE("yaml-cpp Library FOUND: yaml-cpp related sources will be built.")
    ELSEIF(YamlCpp_FOUND)
        MESSAGE("yaml-cpp Library NOT FOUND!")
    ENDIF(YamlCpp_FOUND)
    
  3. Добавьте код в src/CmakeFiles.txt для использования FindYamlCpp.

        # Enable Yaml 
        IF(YAMLCPP_FOUND)
            ADD_EXECUTABLE(my_exec my_source.cpp)
        ENDIF(YAMLCPP_FOUND)
    
  4. Используя, например, ccmake:

    1. set CMAKE_MODULE_PATH to /usr/local/share/cmake/Modules
    2. Задайте для CMAKE_EXEC_LINKER_FLAGS значение -lyaml-cpp.
person Joan Solà    schedule 01.05.2016