2

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

4

0 回答 0