gcc/g++ 链接顺序注意事项
2020-04-20 16:00:18来源:博客园 阅读 ()
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原文链接:https://www.cnblogs.com/xiaoshiwang/p/12739494.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- C++ 函数和链接性 2020-05-18
- C++ 静态持续变量 2020-05-10
- G++编译链接的那些事!G++的特殊使用方法[常用] 2020-04-19
- g++链接gcc编译的库报错“undefined reference to xxx” 2020-04-14
- 在Android平台使用SNPE应链接libc++库 2020-03-17
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash