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
    
  • 相关阅读:
    微信小程序自定义分享图片
    rtop:一个通过 SSH 监控远程主机的交互式工具【转】
    mysql双主+keepalived【转】
    诡异的Linux磁盘空间被占用问题,根目录满了,df和du占用不一样【转】
    linux磁盘空间查看inode
    python数据库操作
    Jenkins 安装及使用
    编程入门python之定义函数【转】
    grep和sed匹配多个字符关键字的用法
    linux 如何删除文件夹下面的文件和文件夹,只保留两个文件
  • 原文地址:https://www.cnblogs.com/stdpain/p/13264313.html
Copyright © 2011-2022 走看看