我們知道選項-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
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/36233.html
標籤:C++
上一篇:請問這個怎么解決,幫下忙,謝謝
下一篇:定位new運算式與顯式呼叫解構式
