GCC 链接顺序问题

参考:http://www.liaoqiqi.com/post/69

我们在编译boost日志库时需要链接较多的库例如 -lboost_log -lboost_log_setup -lboost_system -lboost_thread
如果链接顺序有问题,就会造成链接失败
但是日常开发过程中,维护链接顺序,甚至链接库之间循环依赖会加大维护难度,会影响开发效率

还好GCC提供了链接参数
例如:

gcc -o print_log print_log.cc -Xlinker "-(" -lboost_log -lboost_log_setup  -lboost_system -lboost_thread -Xlinker "-)"

这样即使链接顺序不对,也不怕了

另外gcc源文件的时候最好放在前面

g++ -g -std=c++11 -o coro -I ~/boost/output/include -L~/boost/output/lib -Xlinker "-(" -lpthread -lboost_atomic -lboost_chrono -lboost_container -lboost_context -lboost_contract -lboost_coroutine -lboost_date_time -lboost_exception -lboost_fiber -lboost_filesystem -lboost_graph -lboost_iostreams -lboost_locale -lboost_log -lboost_log_setup -lboost_math_c99 -lboost_math_c99f -lboost_math_c99l -lboost_math_tr1 -lboost_math_tr1f -lboost_math_tr1l -lboost_program_options -lboost_python27 -lboost_random -lboost_regex -lboost_serialization -lboost_stacktrace_addr2line -lboost_stacktrace_basic -lboost_stacktrace_noop -lboost_system -lboost_thread -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization  -Xlinker "-)" coro.cpp

改成这样就好了:

g++ -g -std=c++11 coro.cpp -o coro -I ~/boost/output/include -L~/boost/output/lib -Xlinker "-(" -lpthread -lboost_atomic -lboost_chrono -lboost_container -lboost_context -lboost_contract -lboost_coroutine -lboost_date_time -lboost_exception -lboost_fiber -lboost_filesystem -lboost_graph -lboost_iostreams -lboost_locale -lboost_log -lboost_log_setup -lboost_math_c99 -lboost_math_c99f -lboost_math_c99l -lboost_math_tr1 -lboost_math_tr1f -lboost_math_tr1l -lboost_program_options -lboost_python27 -lboost_random -lboost_regex -lboost_serialization -lboost_stacktrace_addr2line -lboost_stacktrace_basic -lboost_stacktrace_noop -lboost_system -lboost_thread -lboost_timer -lboost_type_erasure -lboost_wave -lboost_wserialization  -Xlinker "-)" 

除此之外 gcc 可以指定某个lib进行动态链接或静态链接:

g++ test.cpp -I ~/opt/somelib/include -L ~/opt/somelib/lib -l:libsomelib.a

特殊情况下可以把所有的lib都进行静态链接 一些库可以使用 LDFLAGS 进行指定 -static

g++ test.cpp -static -lpthread

也可以使用 link group

-Wl,--start-group
原文地址:https://www.cnblogs.com/stdpain/p/13264313.html