cdsfiui 发表于 2016-12-28 13:31

可执行程序链接到.o文件和链接到.a文件,行为居然不同

本帖最后由 cdsfiui 于 2016-12-28 13:42 编辑

首先,有两个cpp文件,各自声明了一个类,一个函数,一个类的静态变量。
然后一个main.cpp里面用到了其中一个类文件里面的函数。然后不同的方式链接。
cat First.cpp
#include<stdio.h>
struct First{
First(){printf("First\n");}
};
void f1(){printf("f1\n");}//没有被main用到
static First f_obj;

$cat Second.cpp
#include<stdio.h>
struct Second{
Second(){printf("Second\n");}
};
void f2(){printf("f2\n");}//被main用到了
static Second s_obj;

$cat main.cpp
void f2();
int main()
{
f2();
    return 0;
}

$g++ -c First.cpp-fPIC
$g++ -c Second.cpp -fPIC
$ar -rvs libmystatic.aFirst.o Second.o
$g++ main.cpp -o MylinkSta -lmystatic -L.
$g++ main.cpp -o MyDirect First.o Second.o

$./MylinkSta
Second
f2

$./MyDirect
Second
First
f2
可以看到链接了.a版本的程序,没有构造出First对象。
奇怪的是,链接到.a,和链接到产生这个.a文件的两个.o文件,结果居然不同。

如果说,链接.a的时候,没有用到的对象/符号不会加入到最终的二进制文件里面,那么为什么链接两个.o的版本,会去产生First呢? 解释不通。

我尝试了gcc/clang,在ubuntu/rhel上,都是一样的结果。
C++的ABI里面有没有什么坑能导致这个问题? 我尝试了.so的情况,结果和MyDirect一样,也都构造出来了。就是静态库特殊。
求大侠解释解释。

hellioncu 发表于 2016-12-28 13:39

链接库的时候没用到就不把First.o链进去很正常吧,后面你指定要链接进去,那也没错呀
页: [1]
查看完整版本: 可执行程序链接到.o文件和链接到.a文件,行为居然不同