我有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