看板 C_and_CPP 關於我們 聯絡資訊
我是在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