2014-03-03 26 views
4

我試圖使用新版本的libyaml-cpp並有鏈接器問題(undefined reference to 'YAML::LoadFile(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)')。未定義的引用YAML :: LoadFile

我建庫如下:

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 [email protected] $^ 

我試圖把確切的.so文件在那裏也沒有運氣。使用nm我可以在共享庫中看到一個LoadFile函數。我現在無法弄清楚,如果我以某種方式使用錯誤的構建線或圖書館有問題。

回答

5

這是命令行上的排序問題。我想我永遠不會理解GCC命令行邏輯。簡單地把圖書館結束似乎工作:

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

您是否還安裝了舊版本的庫? gcc可能會首先查找該版本,而不會考慮新版本。

+0

是的,我也有舊的,但不能刪除它(其他的東西都需要它)。這就是爲什麼我通過顯式路徑和/或庫名稱首先加載新路徑。 –

+0

它確實找到它。如果我把'-l:libyaml-cpp.so.0.5'放在一個不存在缺少文件的位置,但是仍然沒有找到引用。 –

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的/模塊
  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的/模塊
    2. 將CMAKE_EXEC_LINKER_FLAGS設置爲-lyaml-cpp