首先,我将提供有关我遇到的问题的具体细节,然后当我尝试调试问题时,我将介绍我从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函数中使用。这会导致链接器错误吗?