对YAML :: LoadFile的未定义引用

时间:2014-03-03 05:16:12

标签: gcc yaml-cpp

我正在尝试使用新版本的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函数。如果我以某种方式使用错误的构建行或者库存在问题,我现在无法弄清楚。

5 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:0)

您是否也安装了旧版本的库? gcc可能首先寻找该版本,而不考虑新版本。

答案 2 :(得分:0)

今天整个晚上,我一直在努力。由于我在互联网上找不到任何有用的信息,我在这里发布我的结果:

使用OSX El Capitan和新版本的XCode(7.3)和CLang(Apple LLVM版本7.3.0(clang-703.0.29)) 使用yaml-cpp 0.5.3

我为使其发挥作用所做的事情:

  1. internet获取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

答案 3 :(得分:0)

支持新的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})

答案 4 :(得分:0)

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