作者QQ29 (我愛阿蓉)
看板C_and_CPP
標題[問題] 關於Static Library 觀念釐清
時間Tue May 14 15:54:59 2013
我是在windows 平台VC~~~
最近被問說...
我們抓到別人提供的static lib我們應該可以自己wrap一下做出自己的Mylib後 只需要
share MyLib給別人用就好了
我直接說抱歉做不到, 就算我包出MyLib 我還是要提供 所有我用到的static lib給第三
者使用
觀念有誤, 這句話我不是很有自信
舉個例子
LibA.lib裡面只有一個method
int LibA(){ return 123;}
Build LibA完全沒問題產生出來後
LibB.lib 裡面 只有一個method寫
int LibA();
int LibB(){return LibA();}
這邊有兩個方式
1. 我原本認知是你在build LibB時 並不需要給他真正的LibA.lib 也就是不用看到LibA
的定義
產生出來的LibB.lib
2. 沒想到我試著讓他看到LibA的定義, 也就是在LibB中先加入LibA.lib然後build
1和2 產生出來的LibB.lib檔案大小差很多, 可想而知2一定比較大....
這邊讓我很懷疑....難道真的可以包別人的code而做出自己的嗎?
於是我寫一個MyApp.exe
裡面用到LibB.lib的method
用1方式build出來的, 一定要給LibA和LibB 給MyApp使用....
但用2方式build出來的, 我覺得"好像"不用給LibA.lib也可以的樣子於是build看看
卻出現了
Error 1 error LNK2011: precompiled object not linked in; image may not run
\MyApp\LibB.lib(LibA.obj) MyApp
我試著dump symbol看一下
第1種出來的libB 裡面只有
___@@_PchSym_@00@UfhvihUqznvhOdxPxsvmtUwlxfnvmghUerhfzoLhgfwrlLBBUkilqvxghUoryyUoryyUwvyftUhgwzucOlyq@BB55BB3035AACD8E
?LibB@@YAHXZ
當然他怎麼會mangling成這樣我毫無頭緒...
第2種出來的會有
?LibA@@YAHXZ
___@@_PchSym_@00@UfhvihUqznvhOdxPxsvmtUwlxfnvmghUerhfzoLhgfwrlLBBUkilqvxghUoryyUoryyUwvyftUhgwzucOlyq@BB55BB3035AACD8E
?LibB@@YAHXZ
奇妙的跑出了LibA這symbol...
我的疑問是
1. 是不是我自己build設定問題導致我產生precompiled object not linked in; image
may not run 的error?
2. 是不是真的可以code包code, 我抓到一個網路上要求要license的static lib, 我只要
wrap一層變成我自己的就很難被抓包了?
3. 還是說本來就不可能可以code包code, 那1和2兩種build方式差別到底在哪裡~~ ...有
什麼use case需要用這兩種build法
毫無頭緒....煩請各位解惑了
謝謝大家
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 118.163.58.205
→ hilorrk:static link 當然可以包進來... 05/14 16:19
推 purpose:把 *.lib 拿去 dumpbin 分析你就百口莫辯了,哪裡難抓包 05/14 16:47
→ QQ29:那我該怎解那個compile error啊 05/14 16:57
→ QQ29:而且那個function怎麼會被naming成這鬼東西@@ 05/14 17:03
推 elfkiller:哈 之前我有問過類似的#1EcxRbzi 你參考看看 05/14 23:35
→ QQ29:看了, 不過推文沒有解釋到底能不能耶 05/15 10:19
→ QQ29:L大說是可以 但不要降做, 其他人是說一定要給相依的lib.. 05/15 10:20
→ QQ29:若一定要給, 我1和2的build法差別在哪? 05/15 10:20
推 littleshan:「可以但不要這樣做」就是要你給相依lib的意思... 05/15 10:58
→ QQ29:L大指的可以, 是說有辦法只給一個lib把別的lib吃掉嗎? 05/15 11:17
→ QQ29:因為我這compile error很好奇是不是可以修掉 05/15 11:17