最初に、私が抱えている問題について具体的な詳細を説明します。次に、問題をデバッグしようとしたときに nm から得られる興味深い結果について説明します。nm の第一人者がこれらの結果を解釈できることを願っています。
カサブランカ 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 を実行すると、次の 2 行が表示されます (何千もの行で区切られています)。
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); });
つまり、ラムダ関数内で使用されます。それはリンカーエラーを引き起こす可能性がありますか?