yaml-cpp的编译器错误-未定义对`yaml::detail::node_data::convert_to_map`
Compiler error with yaml-cpp - undefined reference to `YAML::detail::node_data::convert_to_map`
以下是完整的日志:
/tmp/ccCvErNZ.o: In function `YAML::detail::node& YAML::detail::node_data::get<std::string>(std::string const&, std::shared_ptr<YAML::detail::memory_holder>)':
cricket.cpp:(.text._ZN4YAML6detail9node_data3getISsEERNS0_4nodeERKT_St10shared_ptrINS0_13memory_holderEE[_ZN4YAML6detail9node_data3getISsEERNS0_4nodeERKT_St10shared_ptrINS0_13memory_holderEE]+0x94): undefined reference to `YAML::detail::node_data::convert_to_map(std::shared_ptr<YAML::detail::memory_holder>)'
collect2: error: ld returned 1 exit status
我试图编译的代码是简单的
#include <iostream>
#include <yaml-cpp/yaml.h>
using namespace std;
int main() {
YAML::Node test = YAML::LoadFile("test.yaml");
if (test["date"]) {
cout << "HELLO";
}
return 0;
}
我使用的YAML是http://www.yaml.org/start.html
如果我只是尝试加载YAML,它加载得很好。但如果我试图访问任何数据,我会得到同样的错误。所以这不是一个联系问题。
EDIT:我可以做cout << test
和cout << test.type()
等功能。我认为问题在于使用基于字符串的映射来访问内部节点。
您似乎没有正确链接yaml-cpp
库。编译时添加参数-lyaml-cpp
。例如:
g++ -I/usr/local/include -L/usr/local/lib -lyaml-cpp -o test main.cpp
编辑
另一个选项是将此cmake包含到您的CMakeLists.txt:中
# attempt to find static library first if this is set
if(YAMLCPP_STATIC_LIBRARY)
set(YAMLCPP_STATIC libyaml-cpp.a)
endif()
# find the yaml-cpp include directory
find_path(YAMLCPP_INCLUDE_DIR yaml-cpp/yaml.h
PATH_SUFFIXES include
PATHS
~/Library/Frameworks/yaml-cpp/include/
/Library/Frameworks/yaml-cpp/include/
/usr/local/include/
/usr/include/
/sw/yaml-cpp/ # Fink
/opt/local/yaml-cpp/ # DarwinPorts
/opt/csw/yaml-cpp/ # Blastwave
/opt/yaml-cpp/
${YAMLCPP_DIR}/include/)
# find the yaml-cpp library
find_library(YAMLCPP_LIBRARY
NAMES ${YAMLCPP_STATIC} yaml-cpp
PATH_SUFFIXES lib64 lib
PATHS ~/Library/Frameworks
/Library/Frameworks
/usr/local
/usr
/sw
/opt/local
/opt/csw
/opt
${YAMLCPP_DIR}/lib)
# handle the QUIETLY and REQUIRED arguments and set YAMLCPP_FOUND to TRUE if all listed variables are TRUE
include(FindPackageHandleStandardArgs)
FIND_PACKAGE_HANDLE_STANDARD_ARGS(YAMLCPP DEFAULT_MSG YAMLCPP_INCLUDE_DIR YAMLCPP_LIBRARY)
mark_as_advanced(YAMLCPP_INCLUDE_DIR YAMLCPP_LIBRARY)
我在Debian系统上编译OpenXcom时遇到了类似的情况。事实证明,我使用的是测试包和稳定包的组合,yaml包来自稳定包,如果只有几个初始函数,这种组合会导致链接失败。
如果这就是你正在经历的(你也在使用Debian),试着用从stable编译一个源代码包
apt-get --build source libyaml-cpp0.5/stable
这个命令将为libyaml构建.deb包,然后可以使用dpkg插入它们,如下所示:
dpkg -i libyaml-cpp0.5*.deb
作为根。
从源代码编译libyaml将使其链接到您已经拥有的测试库,而不是期望稳定的库,因此应该可以解决上述问题。至少对我来说是这样。
即使您不使用Debian,出于类似的原因,从源代码(例如tarball)编译yaml-cpp也可能有效。
确保这两个文件存在:
/usr/local/lib/libyaml-cpp.a
/usr/local/include/yaml-cpp/yaml.h
我的CMakeLists.txt:
CMAKE_MINIMUM_REQUIRED(VERSION 3.4)
FIND_PACKAGE(yaml-cpp REQUIRED)
ADD_EXECUTABLE(yaml_cpp_test yaml_cpp_test.cpp)
TARGET_LINK_LIBRARIES(yaml_cpp_test yaml-cpp)
yaml_cpp_test.cpp的内容与问题中提到的内容相同。
我试图在vps(Ubuntu 14.04.1 LTS)上重新出现问题
wget -c https://github.com/jbeder/yaml-cpp/archive/release-0.5.1.tar.gz
tar xvf release-0.5.1.tar.gz yaml-cpp-release-0.5.1/
cd yaml-cpp-release-0.5.1/
sudo apt-get install cmake
sudo apt-get install libboost-dev
cmake .
make
make install
之后,yaml-cpp安装到/usr/local/lib和/usr/local/include
我的工作目录中的文件:
fqlgy@li407-86:~/yaml-cpp$ ll
total 12
-rw-r--r-- 1 fqlgy fqlgy 162 May 8 03:29 CMakeLists.txt
-rw-r--r-- 1 fqlgy fqlgy 10 May 8 03:11 test.yaml
-rw-r--r-- 1 fqlgy fqlgy 240 May 8 03:11 yaml_cpp_test.cpp
当我试图运行"cmake."时,出现了一些错误,所以我删除了行CMakeFiles/CMakeOutput.log
,CMakeLists.txt的内容是:
CMAKE_MINIMUM_REQUIRED(VERSION 2.6)
ADD_EXECUTABLE(yaml_cpp_test yaml_cpp_test.cpp)
TARGET_LINK_LIBRARIES(yaml_cpp_test yaml-cpp)
以下输出如预期:
fqlgy@li407-86:~/yaml-cpp$ cmake .
-- Configuring done
-- Generating done
-- Build files have been written to: /home/fqlgy/yaml-cpp
fqlgy@li407-86:~/yaml-cpp$ make
Scanning dependencies of target yaml_cpp_test
[100%] Building CXX object CMakeFiles/yaml_cpp_test.dir/yaml_cpp_test.cpp.o
Linking CXX executable yaml_cpp_test
[100%] Built target yaml_cpp_test
fqlgy@li407-86:~/yaml-cpp$ ./yaml_cpp_test
HELLO
我确认某些版本的yaml-cpp库包含此问题(这与不正确的链接无关)。它相当脏,但我已经通过在代码中定义空函数来解决它,它看起来像
YAML::BadConversion::~BadConversion()
{
}
void YAML::detail::node_data::convert_to_map(std::shared_ptr<YAML::detail::memory_holder>)
{
}
这种方法并不完美(例如,如果使用另一个库版本,会导致重复)。
在我的情况下,我在两台计算机上运行完全相同的代码,但其中一台计算机上只出现错误,这几乎让我发疯。这不是编译错误、链接错误或其他什么,我认为代码是脏的或其他什么。
我尝试了所有选项:
- 使用CCD_ 6=>CCD_ 7=>
make install
- 与1相同,使用
CC=$(which gcc) CXX=$(which g++) cmake -DBUILD_SHARED_LIBS=ON ..
- 从apt卸载默认包(我使用ubuntu 16.04)
所有的都失败了,直到我找到Ilya Golshtein的答案,然后在我将使用yaml-cpp的代码中,我在YAML::LoadFIle
行之前添加了这个代码jsut
YAML::BadConversion::~BadConversion()
{
}
void YAML::detail::node_data::convert_to_map(std::shared_ptr<YAML::detail::memory_holder>)
{
}
这是唯一一个在上运行的解决方案
我来晚了,不知道我在做什么,但对于那些在Windows上的人来说,请确保你的IDE喜欢你的mingw-g++。我的auto默认为草莓perl(?),当我把它改为mingw-g++时,一切都开始工作了。我想这和版本控制有关吧?
它也困扰着我。当yaml-cpp的版本是";0.7.0〃;。我用";0.6.0〃;相反
在我的案例中,这是安装多个库的问题。我已经安装了ROS,它似乎也与yaml-cpp一起发货。不同版本之间的冲突触发了未定义的引用错误。
卸载我添加的所有yaml-cpp版本解决了这个问题。
- node-gyp 在 macOS 上未正确链接库
- 为什么C++对链表中的下一个节点使用指针,而像 C# 或 Java 这样的语言只使用类 Node 的名称?
- node-gyp 的先有鸡还是先有蛋的问题:指向依赖项中的头文件
- 在 ubuntu 上安装 node js pulsar 客户端
- 如何使用 Node-addon-API 实现 node-nan 回调
- Node.js fs.open() 在尝试打开 4 个以上的命名管道 (FIFO) 后挂起
- NodeJS:node-gyp 编译与等效的 gcc -lm 选项
- 调用'Node'构造函数是不明确的
- 为什么我得到变量"Node"不是类型名称错误
- 在 node.js 中将缓冲区从 C++ 转换为 UTF-8 字符串
- 如何从 node-ffi 调用 c++ 中以结构向量作为参数的方法?
- 使用 Node.js N-API 调用 C 函数时,不会显示预期的输出
- 给一个图 G 找到此图中的所有节点 blob,以便 node.color 属性 = 特定颜色
- 为什么 const YAML::Node 对象的行为不像 yaml-cpp 中的类似值的对象?
- 无法使用 'const Node *' 类型的右值初始化 'Node *' 类型的变量
- Node中的子节点列表在C++中的BFS遍历过程中丢失
- 用输出参数包装一个c++函数,以便在javascript/node中使用
- 在node-gip binding.gyp文件中,如何根据系统结构(32位、64位)包含不同的库文件
- Generate boost::uuids::uuid from boost::compute::detail::sha
- node.h/node.cpp/nodelist.cpp之间的关系