2

ブースト asio の例で提供されるサンプル コードをビルドしようとしています: http://www.boost.org/doc/libs/1_54_0/doc/html/boost_asio/example/cpp11/spawn/echo_server.cpp

すべてのコードをコピーして cpp ファイルに入れ、Linux で gcc4.7 と cmake を使用してコンパイルし、ブースト コルーチンとブースト コンテキスト ライブラリをリンクしますが、リンクが失敗します。

出力は以下のリストです。

Linking CXX executable ../../../output/bin/unit_test
cd /home/watson/ID_project/build/server_linux_makefile_gcc/abc/test/unit/abc_async && /usr/local/bin/cmake -E cmake_link_script CMakeFiles/unit_test.dir/link.txt --verbose=1
/usr/bin/c++   -std=c++11 -O3 -DNDEBUG  -pthread -lrt -ltcmalloc -fno-builtin-malloc -fno-builtin-calloc -fno-builtin-realloc -fno-builtin-free CMakeFiles/unit_test.dir/TestFileChannel.cpp.o CMakeFiles/unit_test.dir/TestStreamBuffer.cpp.o CMakeFiles/unit_test.dir/TestTimer.cpp.o CMakeFiles/unit_test.dir/TestThreadPool.cpp.o CMakeFiles/unit_test.dir/TestScheduler.cpp.o CMakeFiles/unit_test.dir/PCH.cpp.o CMakeFiles/unit_test.dir/main.cpp.o CMakeFiles/unit_test.dir/TestUDPNetwork.cpp.o CMakeFiles/unit_test.dir/TestTCPNetwork.cpp.o  -o ../../../output/bin/unit_test -rdynamic ../../../../../../install/thirdparty_linux_makefile_gcc/lib/libboost_unit_test_framework-gcc47-mt-1_54.a ../../../../../../install/thirdparty_linux_makefile_gcc/lib/libboost_context-gcc47-mt-1_54.a ../../../../../../install/thirdparty_linux_makefile_gcc/lib/libboost_coroutine-gcc47-mt-1_54.a ../../../../../../install/thirdparty_linux_makefile_gcc/lib/libboost_thread-gcc47-mt-1_54.a ../../../../../../install/thirdparty_linux_makefile_gcc/lib/libboost_filesystem-gcc47-mt-1_54.a ../../../../../../install/thirdparty_linux_makefile_gcc/lib/libyaml-cpp.a ../../../../../../install/thirdparty_linux_makefile_gcc/lib/libmongoc.a ../../../../../../install/thirdparty_linux_makefile_gcc/lib/libboost_system-gcc47-mt-1_54.a ../../../../../../install/thirdparty_linux_makefile_gcc/lib/libprotobuf.a
../../../../../../install/thirdparty_linux_makefile_gcc/lib/libboost_coroutine-gcc47-mt-1_54.a(coroutine_context.o): In function `boost::coroutines::detail::coroutine_context::coroutine_context(void (*)(long), boost::coroutines::stack_context*)':
coroutine_context.cpp:(.text+0x103): undefined reference to `make_fcontext'
../../../../../../install/thirdparty_linux_makefile_gcc/lib/libboost_coroutine-gcc47-mt-1_54.a(coroutine_context.o): In function `boost::coroutines::detail::coroutine_context::jump(boost::coroutines::detail::coroutine_context&, long, bool)':
coroutine_context.cpp:(.text+0x1bc): undefined reference to `jump_fcontext'
collect2: error: ld returned 1 exit status
make[2]: *** [abc/output/bin/unit_test] Error 1

.a ファイルからシンボル テーブルを出力すると、シンボルjump_fcontext' andmake_fcontext が存在することがわかります。

nm libboost_context-gcc47-mt-1_54.a

make_x86_64_sysv_elf_gas.o:
                 U _GLOBAL_OFFSET_TABLE_
                 U _exit
000000000000002e t finish
0000000000000000 T make_fcontext

jump_x86_64_sysv_elf_gas.o:
0000000000000000 T jump_fcontext

誰かが私にそれについてのヒントを与えることができますか? 私はあらゆる場所でグーグルを試みますが、情報はありません。

4

2 に答える 2

8

boost_contextとのリンク順序を入れ替えてみてくださいboost_coroutine

リンカーのドキュメントには次のように記載されています。

[...] リンカーは、指定された順序でライブラリとオブジェクト ファイルを検索して処理します。したがって、'foo.o -lz bar.o' は、ファイル foo.o の後、bar.o の前にライブラリー 'z' を検索します。bar.o が 'z' 内の関数を参照する場合、それらの関数はロードされない可能性があります。

この場合 、 Boost.CoroutineはBoost.Contextに依存します。そのため、リンクするときboost_coroutineに前に表示する必要があります。boost_contextリンカーの注文の詳細については、この回答を読むことを検討してください。

于 2013-07-26T13:52:46.747 に答える
0

これに別の可能性を追加する (特に Boost Context ライブラリを使用する) - Windows 上の MinGW でビルドする場合、以前のバージョンの MASM を使用すると、シンボルがエクスポートされる方法のために、リンク可能なシンボルを含まない静的ライブラリが生成される可能性があります。

解決策は、MASM 8 で Boost Context を再構築することです。

詳細については、 https://stackoverflow.com/a/26874113/1678468の回答を参照してください。

于 2014-11-11T22:38:29.887 に答える