我有2个cpp文件,每个申报1级+ 1个功能+ 1个的静态对象:相同的C++代码,不同的链接选项导致不同的行为?
$ cat mya.cpp
#include<stdio.h>
struct A{
A(){printf("%s\n",__FUNCTION__);}
};
void fa(){printf("%s\n",__FUNCTION__);}
static A s_obj;
$ cat myb.cpp
#include<stdio.h>
struct B{
B(){printf("%s\n",__FUNCTION__);}
};
void fb(){printf("%s\n",__FUNCTION__);}
static B s_obj;
然后主函数调用 “FB”,而不是 “发”。
$ cat nm.cpp
void fb();
int main()
{
fb();
return 0;
}
我试图编译并以不同的方式链接这些文件:
g++ -c mya.cpp -fPIC
g++ -c myb.cpp -fPIC
ar -rvs libmya.a mya.o
ar -rvs libmyb.a myb.o
ar -rvs libmystatic.a mya.o myb.o
g++ --shared -o libmyshare.so mya.o myb.o
g++ --shared -o libadyn.so mya.o
g++ --shared -o libbdyn.so myb.o
g++ nm.cpp -o use1StaticLib -lmystatic -L.
g++ nm.cpp -o use2StaticLib -lmyb -lmya -L.
g++ nm.cpp -o use1DynamicLib -lmyshare -L.
g++ nm.cpp -o use2DynamicLib -ladyn -lbdyn -L.
g++ nm.cpp -o useDirect mya.cpp myb.cpp
然后我发现了5个可执行文件有不同的行为:
$ ./useDirect
A
B
fb
$ ./use1DynamicLib
A
B
fb
$ ./use2DynamicLib
B
fb
$ ./use1StaticLib
A
B
fb
$ ./use2StaticLib
B
fb
相同的代码,不同的行为,如何我可不会感到困惑吗?
我似乎找到了一些线索,只要将mya.cpp和myb.cpp打包到不同的.a/.so文件中,则“A s_obj”不会被构建。为什么? A的构造函数有副作用,我没有指定任何-O优化。
如果原因是“A s_obj”是一个未使用的对象,所以没有链接,那么,“B s_obj”既不被主函数使用,它为什么总是被构造?
需要听取专家的解释!
全局构造函数不被依赖,但你已经知道了。这只是未定义的,可能是因为涉及语言和操作系统规则。 – Jojje