zoukankan      html  css  js  c++  java
  • 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
    
  • 相关阅读:
    将Emacs Org mode用于GTD任务管理
    以Emacs Org mode为核心的任务管理方案
    Epson L4158打印机安装与配置
    使用wget命令下载网络资源
    Apt下载安装包时Hash校验和不符
    Deep Learning专栏--FFM+Recurrent Entity Network的端到端方案
    Deep Learning专栏--强化学习之从 Policy Gradient 到 A3C(3)
    Deep Learning专栏--强化学习之MDP、Bellman方程(1)
    Deep Learning基础--Softmax求导过程
    Deep Learning基础--随时间反向传播 (BackPropagation Through Time,BPTT)推导
  • 原文地址:https://www.cnblogs.com/stdpain/p/13264313.html
Copyright © 2011-2022 走看看