4

我正在尝试使用新版本的 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在共享库中看到一个函数。我现在不知道我是否以某种方式使用了错误的构建线或库有问题。

4

5 回答 5

8

这是命令行上的排序问题。我想我永远不会理解 GCC 命令行逻辑。简单地将库放在最后似乎可行:

g++ -L/usr/local/lib -I/usr/local/include -std=c++0x -o $@  $^ -lyaml-cpp
于 2014-03-03T05:33:49.963 回答
2

支持新的 yaml-cpp API。

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})
于 2019-05-27T20:34:47.277 回答
1

我通过调整我的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的启发。

于 2019-08-03T10:43:07.630 回答
0

你也安装了旧版本的库吗?gcc 可能会先寻找那个版本,而不考虑新版本。

于 2014-03-03T05:24:25.007 回答
0

我今天整个晚上都在为此苦苦挣扎。由于我在互联网上的任何地方都找不到有用的信息,所以我在这里发布了我的结果:

使用 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. 将 CMAKE_MODULE_PATH 设置为 /usr/local/share/cmake/Modules
    2. 将 CMAKE_EXEC_LINKER_FLAGS 设置为 -lyaml-cpp
于 2016-05-01T19:07:04.260 回答