2013-07-26 52 views
2

我試圖通過升壓ASIO例如構建示例代碼提供: http://www.boost.org/doc/libs/1_54_0/doc/html/boost_asio/example/cpp11/spawn/echo_server.cpp提升協同程序和ASIO測試版本的Linux x64平臺失敗,gcc4.7

我複製了所有代碼,並把它變成一個CPP文件,使用gcc4.7和cmake在linux上進行編譯,與boost協程和boost上下文庫鏈接,但鏈接失敗。

的輸出的文章

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 

我打印符號表從某文件,並找到符號jump_fcontext' and make_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 

有人可以給我任何有關它的提示?我嘗試谷歌每一個地方,但沒有信息。

回答

7

嘗試交換boost_contextboost_coroutine的鏈接順序。

linker documentation狀態:

[...]鏈接器的搜索和處理庫和目標文件在他們指定的順序。因此,'foo.o -lz bar.o'在文件foo.o之後但在bar.o之前搜索庫'z'。如果bar.o引用'z'中的函數,則可能不會加載這些函數。

在這種情況下 Boost.Coroutine取決於Boost.Context。因此,鏈接時boost_coroutine應出現在boost_context之前。有關更多鏈接器訂購細節,請考慮閱讀this答案。

0

只是爲此添加另一種可能性(特別是對於Boost上下文庫) - 如果在Windows上的MinGW下構建,使用早期版本的MASM可以生成靜態庫,因爲符號導出的方式不包含可鏈接的符號。

的解決方案是重建加速語境與MASM 8

看到https://stackoverflow.com/a/26874113/1678468答案以瞭解更多內容。