[問題] 關於Static Library 觀念釐清

看板C_and_CPP作者 (我愛阿蓉)時間12年前 (2013/05/14 15:55), 編輯推噓3(308)
留言11則, 5人參與, 最新討論串1/1
我是在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

05/14 16:19, , 1F
static link 當然可以包進來...
05/14 16:19, 1F

05/14 16:47, , 2F
把 *.lib 拿去 dumpbin 分析你就百口莫辯了,哪裡難抓包
05/14 16:47, 2F

05/14 16:57, , 3F
那我該怎解那個compile error啊
05/14 16:57, 3F

05/14 17:03, , 4F
而且那個function怎麼會被naming成這鬼東西@@
05/14 17:03, 4F

05/14 23:35, , 5F
哈 之前我有問過類似的#1EcxRbzi 你參考看看
05/14 23:35, 5F

05/15 10:19, , 6F
看了, 不過推文沒有解釋到底能不能耶
05/15 10:19, 6F

05/15 10:20, , 7F
L大說是可以 但不要降做, 其他人是說一定要給相依的lib..
05/15 10:20, 7F

05/15 10:20, , 8F
若一定要給, 我1和2的build法差別在哪?
05/15 10:20, 8F

05/15 10:58, , 9F
「可以但不要這樣做」就是要你給相依lib的意思...
05/15 10:58, 9F

05/15 11:17, , 10F
L大指的可以, 是說有辦法只給一個lib把別的lib吃掉嗎?
05/15 11:17, 10F

05/15 11:17, , 11F
因為我這compile error很好奇是不是可以修掉
05/15 11:17, 11F
文章代碼(AID): #1HaUtMl7 (C_and_CPP)