[問題] ar 導致 static member 沒有初始化...?
我遇到一個奇怪的問題,
就是當我在 linux 使用 ar 把 .o 包成 .a 的時候,
被 ar 包裝過的 class 所包含的 static data member 不會初始化……
比方說我有一個檔案 foo.cpp 是這樣
┌────────────────────────────────────┐
|int f() { │
| std::cout << "f()" << std::endl ; │
| return 17 ; │
|} │
| │
|class Foo { │
| static int n ; │
|} │
| │
|int Foo::n = f() ; /* 初始化 static member */ │
└────────────────────────────────────┘
經過下面的 build 步驟……
g++ -c foo.cpp -o foo.o
ar -cr foo.a foo.o
g++ main.cc foo.a
執行 a.out 之後,並沒有印出 "f()"。
但是如果我直接使用 foo.o,
那麼就會正常的印出 "f()"。
比方說這樣……
g++ -c foo.cpp -o foo.o
g++ test.cc foo.o
我好困惑喔。
會有這個問題是因為我在使用 google test 的時候,
發現如果我的 test case 被 ar 包過以後,測試的時候會沒有測到那些項目,
google test 寫 test case 的時候,其實是透過 macro 把 test case 轉成 class。
而 test 的 code 被呼叫的時機,
實際上是這個 class 某一個 static member 初始化的時候會呼叫一個函數,
就像我上面的碼一樣,於是我懷疑 ar 會讓 static member 的初始化被跳過,
後來發現果然是這樣...
雖然說這個 class 只有在這個檔案裡面存在,
所以如果沒被用到的話,被略過好像也沒差。
但是為什麼 ar 之後就會略過呢?
直接拿 .o 來 link 又為什麼就不會被略過?
囧困,請前輩開示。
OS: 小紅帽
Compiler: gcc 3.3
--
To iterate is human, to recurse, divine.
遞迴只應天上有, 凡人該當用迴圈. L. Peter Deutsch
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 118.160.114.40
→
10/30 02:12, , 1F
10/30 02:12, 1F
→
10/30 02:13, , 2F
10/30 02:13, 2F
→
10/30 02:15, , 3F
10/30 02:15, 3F
→
10/30 02:15, , 4F
10/30 02:15, 4F
→
10/30 02:16, , 5F
10/30 02:16, 5F
→
10/30 02:18, , 6F
10/30 02:18, 6F
→
10/30 02:19, , 7F
10/30 02:19, 7F
→
10/30 02:22, , 8F
10/30 02:22, 8F
→
10/30 02:22, , 9F
10/30 02:22, 9F
推
10/30 02:26, , 10F
10/30 02:26, 10F
→
10/30 02:32, , 11F
10/30 02:32, 11F
→
10/30 02:35, , 12F
10/30 02:35, 12F
→
10/30 02:35, , 13F
10/30 02:35, 13F
→
10/30 02:36, , 14F
10/30 02:36, 14F
→
10/30 02:50, , 15F
10/30 02:50, 15F
→
10/30 02:50, , 16F
10/30 02:50, 16F
→
10/30 14:22, , 17F
10/30 14:22, 17F
→
10/30 14:22, , 18F
10/30 14:22, 18F
→
10/30 14:22, , 19F
10/30 14:22, 19F
→
10/30 14:23, , 20F
10/30 14:23, 20F
→
10/30 15:42, , 21F
10/30 15:42, 21F
→
10/30 15:42, , 22F
10/30 15:42, 22F
→
10/30 15:42, , 23F
10/30 15:42, 23F
→
10/30 15:42, , 24F
10/30 15:42, 24F
→
10/30 20:58, , 25F
10/30 20:58, 25F
→
10/30 20:58, , 26F
10/30 20:58, 26F
→
10/30 20:58, , 27F
10/30 20:58, 27F
→
10/30 20:59, , 28F
10/30 20:59, 28F
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章