• 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
    
  • 相关阅读:
    Oracle关于快速缓存区应用原理
    Caused by: java.lang.ClassNotFoundException: org.apache.commons.fileupload.RequestContext
    速记const 指针与指向const的指针
    bzoj3992【SDOI2015】序列统计
    ubuntu 1204 安装mysql
    解决getOutputStream() has already been called for this response
    把一个project相关的jar放到project的lib文件夹中
    解决eclipse偶尔无视breakpoint的行为
    解决eclipse无法打开:Failed to load the JNI shared library
    挣值管理公式集合
  • 原文地址:https://www.cnblogs.com/stdpain/p/13264313.html
Copyright © 2020-2023  润新知