gcc/g++ 連接順序注意事項

咱們知道選項-l是指定要連接的庫,可是若是有多個庫的時候,哪一個放前面哪一個放後面呢?c++

結論:被別的庫使用的庫,放在使用它的庫的後面

使用下面的代碼,驗證一下shell

#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以前了),編譯它的時候,就會出錯誤。oop

$ 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裏的,頭文件也都對,爲何呢?c++11

修改代碼,把①處的註釋打開,再用下面的命令編譯,編譯竟然經過了。code

$ 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類又沒有被包含進來,就發生了編譯錯誤。get

再把①處的註釋掉,使用下面的命令編譯,也能夠編譯經過了。it

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

最佳方案:編譯時把muduo_net放在muduo_base後面。

c/c++ 學習互助QQ羣:877684253 本人微信:xiaoshitou5854

相關文章
相關標籤/搜索