调试C ++链接器错误

时间:2014-09-22 20:11:33

标签: c++ linker nm casablanca

首先,我将提供有关我遇到的问题的具体细节,然后当我尝试调试问题时,我将介绍我从nm获得的有趣结果。希望nm大师能够解释这些结果。

我已经将Casablanca C ++ REST SDK静态编译为库libcpprest.a。这工作正常,但当我使用命令链接我的代码时:

/usr/bin/c++       CMakeFiles/dcodr_service.dir/dcodr_service.cc.o 
CMakeFiles/dcodr_service.dir/viterbi.cc.o CMakeFiles/dcodr_service.dir/utils.cc.o 
CMakeFiles/dcodr_service.dir/hmm.cc.o CMakeFiles/dcodr_service.dir/grammar.cc.o  
-o dcodr_service  -L/home/user/casablanca/Release/Binaries -rdynamic -lfftw3f
-lcpprest -lcommon_utilities -lboost_program_options -lboost_regex -lboost_system 
-lboost_filesystem -lboost_iostreams /opt/OpenBLAS/lib/libopenblas.a -Wl,
-rpath,/home/user/casablanca/Release/Binaries 

我收到错误:

CMakeFiles/dcodr_service.dir/dcodr_service.cc.o: In function 
`web::http::http_request::extract_json(bool) 
const::{lambda(unsigned long)#1}::operator()(unsigned long) const':
/home/user/casablanca/Release/include/cpprest/http_msg.h:829: 
undefined reference to `web::http::details::http_msg_base::_extract_json(bool)'

似乎_extract_json(bool)是在http_msg.cpp中定义的,当我查看制作libcpprest.a的详细输出时,它似乎也被编译。现在,运行nm -e --demangle libcpprest.a我得到以下两行(由数千个其他行分隔):

00000000000015ee T web::http::details::http_msg_base::_extract_json(bool)
                 U web::http::details::http_msg_base::_extract_json(bool)

我是使用nm的新手,但在我看来_extract_json(bool)都在代码部分和未定义符号列表中。有没有更好的方法来解释nm结果?

顺便说一句,当我将cpprest编译为动态库并链接它时,一切正常,但由于各种原因,我必须创建一个dcodr_service的静态二进制文件。

编辑: 跟进πάντα ῥεῖ的评论,_extract_json(bool)用于以下语境:

        return pplx::create_task(_m_impl->_get_data_available())
.then([impl, force](utility::size64_t) { return impl->_extract_json(force); });

也就是说,它在lambda函数中使用。这会导致链接器错误吗?

0 个答案:

没有答案