c++的.o文件的链接顺序
linker对链接顺序要求很严格,如果顺序有误,多半就会报undefined reference to xxxxxx的错误
文件目录:

代码:
main.cpp
#include "Test.h" using namespace std; int main()
{
Test::testLiftOff();
return ;
}
Test.cpp
#include "Test.h" #include "LiftOff.h" #include <zthread/Thread.h> #include <iostream> // std::cout void Test::testLiftOff()
{
using namespace ZThread; try {
for (int i = ; i < ; ++i)
{
Thread th(new LiftOff(, i));
}
std::cout << "waiting for lift off" << std::endl;
} catch (Synchronization_Exception &e) {
std::cerr << e.what() << std::endl;
}
} Test::Test()
{
//ctor
} Test::~Test()
{
//dtor
}
LiftOff.cpp
#include "LiftOff.h" #include <iostream> using namespace std; LiftOff::LiftOff(int countDown_, int id_)
:countDown(countDown_), id(id_)
{
// do nothing
} LiftOff::~LiftOff()
{
cout << "LiftOff" << id << " destroyed" << endl;
} void LiftOff::run()
{
while (countDown--)
cout << id << " count: " << countDown << endl;
cout << id << "LiftOff!" << endl;
}
Test.h
#ifndef TEST_H
#define TEST_H class Test
{
public:
static void testLiftOff(); private:
Test();
~Test();
}; #endif // TEST_H
LiftOff.h
#ifndef LIFTOFF_H
#define LIFTOFF_H #include <zthread/Runnable.h> class LiftOff : public ZThread::Runnable
{
public:
LiftOff(int countDown_, int id_);
~LiftOff();
void run();
private:
int countDown;
int id;
}; #endif // LIFTOFF_H
显然,main.cpp 通过 Test.h 引用 Test.cpp 的 implementation 。 说人话? 好吧 。。。 具体来说就是linker在发现main.cpp 中的 Test::testLiftOff() 调用的时候, 需要去找Test::testLiftOff()的implementation,去哪找?当然是Test.cpp中,编译为obj文件后,其实就是main.o 依赖于 Test.o
我们把这种关系描述为 main.o < Test.o
类似的还有 Test.o < LiftOff.o 、 Test.o < zthread_win3.a
总的原则就是:如果A.o依赖于B.o,那么在linker命令中,A.o必须在B.o的左边(可以不相邻)
所以在链接的时候,命令为:
g++ -o test.exe main.o Test.o LiftOff.o -s zthread_win32.a // linker command 1
其实,只要顺序不违反上面的关系定义,后面的顺序是可以任意调整的,例如,实际上LiftOff.o与-s zthread_win3.a的顺序调一下也是可以的
g++ -o test.exe main.o Test.o -s zthread_win32.a LiftOff.o // linker command 2
总结:
你编译上面的代码为:
g++ -c *.cpp
链接的时候上面给出的linker command 1、linker command 2任意选一个都行
另外:
事实上,在linux下,由于ZThread依赖于Posix Thread Library,在 -s zthread_xxx.a之后还需要-lpthread来加载Posix Thread Library,也是这个原因,见这篇随笔
c++的.o文件的链接顺序的更多相关文章
- Linux链接库四(多个库文件链接顺序问题)
最近在Linux下编程发现一个诡异的现象,就是在链接一个静态库的时候总是报错,类似下面这样的错误: (.text+0x13): undefined reference to `func' 关于unde ...
- gcc/g++动态链接库和静态库的链接顺序
转自:http://withc8212.blog.163.com/blog/static/11656983820109263562854/ so文件:动态库a文件: 静态库exe文件:可执行程序(li ...
- gcc中动态库和静态库的链接顺序
so文件:动态库a文件: 静态库exe文件:可执行程序(linux下以文件属性来标示是否是可执行文件,与后缀名无关) 经过自己写的一些测试程序,大致了解了下gcc中链接顺序问题,总结出以下几点:1,动 ...
- C++头文件的包含顺序研究
一.<Google C++ 编程风格指南>里的观点 公司在推行编码规范,领导提议基本上使用<Google C++ 编程风格指南>.其中<Google C++ 编程风格指南 ...
- 保存chrome书签中链接顺序的小技巧
长期以来,我的chrome浏览器书签总是不能自主排序,用书签管理器排序之后,不关闭chrome是好的,一旦关闭重开,又会恢复成原先的排序,实在很诧异,手动修改Bookmars文件也不行. 我们知道,如 ...
- Linux ln命令 - 建立文件/目录链接
转自Linux ln命令 - 建立文件/目录链接 1. 使用方式:ln [option] source_file dist_file -f 建立时,将同档案名删 ...
- Beyond Compare 忽略两个文件内容的顺序比较文件内容(xjl456852原创)
有时两个文件内容的顺序是不固定的,对比时需要忽略文件顺序进行对比. 可以这样设置: 点击菜单下面工具栏按钮: 点击Format旁的三角,选择Sorted,就会按文件的顺序排序比较.忽略了文件内容顺序的 ...
- google C++编程风格指南之头文件的包括顺序
google C++编程风格对头文件的包括顺序作出例如以下指示: (1)为了加强可读性和避免隐含依赖,应使用以下的顺序:C标准库.C++标准库.其他库的头文件.你自己project的头文件.只是这里最 ...
- centos7 中将执行文件python链接为python3后 如何保证 yum 功能不受影响
1. 查看 /usr/bin 中 python 执行文件的 链接情况 2. 设置 python 命令的可执行文件 链接为 python3 3. 此时 , yum 文件中的p ...
随机推荐
- 四.rocketMQ原理
⦁ mqnamesrv服务 broker启动的时候(单个.多个),都会去查找namesrv注册. Producer发生消息的时候会根据topic获取路由到broker的信息. Consumer根 ...
- unity3d的矩阵元素存储方式
想知道u3d矩阵各个元素的存储方式,所以测试了一下 Matrix4x4 m = Matrix4x4.TRS(new Vector3(1, 2, 3), Quaternion.Euler(0, 0, 3 ...
- Context Menus
转载:http://open.chrome.360.cn/extension_dev/contextMenus.html 内容 清单 范例 API 参考: Chrome.contextMenus 方法 ...
- [Python爬虫] 之十二:Selenium +phantomjs抓取中的url编码问题
最近在抓取活动树网站 (http://www.huodongshu.com/html/find.html) 上数据时发现,在用搜索框输入中文后,点击搜索,phantomjs抓取数据怎么也抓取不到,但是 ...
- 【日志处理】logstash性能优化配置
2W条数据用时4秒完成,每秒5000条左右,昨天是同时写入到文件和标准输出,看起来是output的问题,这块性能应当可以满足性能要求了 后继我会继续把结果输出到tcp,kafka来测试经过grok后的 ...
- js 在表单提交前进行操作
最近在写页面的时候,需要手动写一些在表单进行提交前的验证操作,正好看到了2种阻止表单提交的方法,可以进行一些逻辑处理 方法一:使用return false 原生js写法: <form id=&q ...
- 猫猫学iOS之UITextField右边设置图片,以及UITextField全解
猫猫分享,必须精品 原创文章.欢迎转载.转载请注明:翟乃玉的博客 地址:http://blog.csdn.net/u013357243 效果: 封装好的方法: 猫猫封装的一个小方法,简单共享出来,方便 ...
- 阅读源代码的重要性:如厨师选食材,耍厨具——在Eclipse中怎样查看Java、Android源代码
首先,非常多人说,不会看jdk中的源代码就不叫学过Java.显然这是肯定的.打个例如:真正的厨师须要从食材的选取.加工.到最后的烹饪.装盘成型,甚至到最后给用户介绍食用方法等一整套流程走下来.而实际上 ...
- 云计算之路-试用Azure-飞流直下三千尺:实测虚拟机磁盘IO
Azure的Temporary Storage(临时存储)磁盘的IO速度曾经是个传说,只知道它很快,但不知道究竟有多快.而Azure中国的情况怎么样,我们来实测一下. 测试环境:Azure上海机房,1 ...
- Hibernate关系映射(注解)
1.类级别注解 @Entity 映射实体类 @Table 映射数句库表 @Entity(name="tableName") - 必须,注解将一个类声明为一个实体bea ...