咱們知道選項-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