zoukankan      html  css  js  c++  java
  • gcc/g++ 链接顺序注意事项

    我们知道选项-l是指定要链接的库,但是如果有多个库的时候,哪个放前面哪个放后面呢?

    结论:被别的库使用的库,放在使用它的库的后面

    使用下面的代码,验证一下

    #include <muduo/base/Logging.h>
    #include <muduo/net/EventLoop.h>
    
    muduo::net::EventLoop* g_loop;
    int timerfd;
    
    int main(void)
    {
      muduo::net::EventLoop loop;
      g_loop = &loop;
      //LOG_INFO << "pid = " << getpid();//------①
    }
    

    这段代码使用了muduo库里的base库(Logging属于base库)和net库(EventLoop属于net库)。

    那么,使用下面的命令(muduo_base放在muduo_net之前了),编译它的时候,就会出错误。

    $ g++ 01.cc -lmuduo_base -lmuduo_net -std=c++11 -pthread
    

    错误信息:无法链接Logger类。

    /muduo-2.0.0/muduo/net/EventLoop.cc:38: undefined reference to `muduo::Logger::Logger(muduo::Logger::SourceFile, int, bool)'
    

    检查了一遍,Logger确实是在库muduo_base里的,头文件也都对,为什么呢?

    修改代码,把①处的注释打开,再用下面的命令编译,编译居然通过了。

    $ g++ 01.cc -lmuduo_base -lmuduo_net -std=c++11 -pthread
    

    注释打开后,就告诉了编译起,要使用LOG_INFO,LOG_INFO在库muduo_base里,所以链接的时候,就会把LOG_INFO包含进来;注释没有打开的时候,由于没有使用LOG_INFO,所以链接的时候,就没有把LOG_INFO包含进来,所以就导致了编译EventLoop时,发现EventLoop.cc的第38行,使用了Logging类,但是Logging类又没有被包含进来,就发生了编译错误。

    再把①处的注释掉,使用下面的命令编译,也可以编译通过了。

    $ g++ 01.cc -lmuduo_net -lmuduo_base -std=c++11 -pthread
    

    最佳方案:编译时把muduo_net放在muduo_base后面。

    c/c++ 学习互助QQ群:877684253 本人微信:xiaoshitou5854

  • 相关阅读:
    [Ps]图层混合模式——排除
    [Swift]自定义View
    [Swift]Closures概念与使用
    [Swift]Class的概念与使用
    [Swift][OC]tableView去掉顶部空白
    html引用css的四种方法
    plSQL技巧:“tns:无法解析指定的连接标识符”问题详解
    桌面任务栏右侧的输入法状态(也就是语言栏)不见了,通常有以下几种解决方法:
    Myeclipse下java.lang.OutOfMemoryError: Java heap space的解决
    Tomcat使用相对路劲来访问
  • 原文地址:https://www.cnblogs.com/xiaoshiwang/p/12739494.html
Copyright © 2011-2022 走看看