[問題] lib檔

看板C_and_CPP作者 (沒有暱稱)時間14年前 (2011/10/17 13:02), 編輯推噓3(3043)
留言46則, 10人參與, 最新討論串1/1
最近用VS2008弄一個自己寫的靜態庫給朋友 裡面有用的其他函式庫 然後我發現要用我寫的函式庫時 必須要把我有用到的其他函式庫的lib檔一起附給他 否則他無法使用 1. 難道沒有辦法只給我寫的lib檔嗎? 是我make的有問題還是? 2. 為什麼自己寫的lib檔要link; 而其他函式庫中的不用, 只要告知include目錄? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.44.83.157

10/17 13:17, , 1F
1.一定要給,你有用到其他lib的東西,不一起給,對方
10/17 13:17, 1F

10/17 13:17, , 2F
那邊使用到你的lib會不完全
10/17 13:17, 2F
感謝 另外順便問一下 如果我使用"inline" 能不能偷雞把對方已封裝的函式包進來

10/17 13:20, , 3F
我覺得這是根本觀念上的問題
10/17 13:20, 3F

10/17 13:20, , 4F
你要用到external的東西就一定要link,看從哪邊link的問題
10/17 13:20, 4F

10/17 13:23, , 5F
你build出來的library只會有你寫的程式的目的碼
10/17 13:23, 5F

10/17 13:23, , 6F
正常是不會幫你包進其它library的東西
10/17 13:23, 6F

10/17 13:25, , 7F
VC專案建起來的時候就有列出一些預設的函式庫了
10/17 13:25, 7F

10/17 13:25, , 8F
並不是只要inlcude就可以用,而是預設就會link
10/17 13:25, 8F
那我可以自己設定成預設link嗎?

10/17 13:29, , 9F
又或說你所謂的library是source release直接包在專案中
10/17 13:29, 9F

10/17 13:30, , 10F
編輯的時候直接幫你編好可以直接resolve到
10/17 13:30, 10F

10/17 13:30, , 11F
這樣就不需要特別去設定import library
10/17 13:30, 11F
這三行不太懂 可否詳述 感恩

10/17 13:34, , 12F
VC的include目錄應該是找標頭檔用的 要 %LIBPATH% 才是
10/17 13:34, 12F
語意有誤Sorry, 是%LIBPATH%沒錯, 我好奇的是為什麼用其他函式庫時(不一定是標準函式庫) 都不需要在linker(相依性)那邊連結lib檔 但自己寫出來的要? 感謝解答 ※ 編輯: elfkiller 來自: 114.44.83.157 (10/17 13:42)

10/17 14:02, , 13F
因為他們的header裡面有指定好library name了
10/17 14:02, 13F

10/17 14:05, , 14F
你用哪個其他函式庫是不需要連結的…?
10/17 14:05, 14F

10/17 14:05, , 15F
例如#pragma comment( lib, "library" )
10/17 14:05, 15F

10/17 14:05, , 16F
如果完全沒指定名稱compiler怎麼可能會曉得要去哪找
10/17 14:05, 16F

10/17 14:06, , 17F
所以我說是觀念的問題,不要用現象去導觀念
10/17 14:06, 17F

10/17 14:06, , 18F
而是要用正確的觀念去解釋現象
10/17 14:06, 18F

10/17 14:12, , 19F
如果同一個目錄下有不同版本的library
10/17 14:12, 19F

10/17 14:12, , 20F
照原po的想法可以只要加path就全部去搜尋,不就亂掉了
10/17 14:12, 20F

10/17 14:54, , 21F
所以是因為一般函式庫都會在標頭檔加入pragma comment
10/17 14:54, 21F

10/17 14:54, , 22F
我這樣理解的正確嗎?
10/17 14:54, 22F

10/17 14:55, , 23F
也就是說如果用g++就要自己手動打?
10/17 14:55, 23F

10/17 14:56, , 24F
g++(該說Linux)通常是把.so檔放到系統的特定目錄
10/17 14:56, 24F

10/17 15:00, , 25F
那.a檔呢? 對應於windows的.lib, 需要加-l指令嗎?
10/17 15:00, 25F

10/17 17:28, , 26F
我覺得你被 vc 養壞了 (還蠻常見的事)
10/17 17:28, 26F

10/17 17:29, , 27F
所有程式用到之 lib ,一定都要到齊,不論是 win/linux.
10/17 17:29, 27F

10/17 17:30, , 28F
而#pragma comment 是開放在程式碼裡指定連結的 lib.
10/17 17:30, 28F

10/17 17:31, , 29F
你即使不在程式碼裡寫,也可用 ide 設定,或在使用CL.exe
10/17 17:31, 29F

10/17 17:32, , 30F
(或Link.exe)時,指定引入lib(含指定path).g++如果可在
10/17 17:32, 30F

10/17 17:34, , 31F
程式碼裡,有類#pragma~之指令,你也不用再用下 -l 指令.
10/17 17:34, 31F

10/17 17:36, , 32F
結論是,雖vc讓人感覺平時沒連lib,但ide都做了預設動作.
10/17 17:36, 32F

10/17 17:37, , 33F
要在其它電腦執行時,所有lib都要到位.
10/17 17:37, 33F

10/17 19:26, , 34F
linux是可以把.a把他解壓縮為多個.o然後再重包啦...
10/17 19:26, 34F

10/17 19:27, , 35F
但那樣就不太對
10/17 19:27, 35F

10/17 22:54, , 36F
雖然說..這真的不太對,不過如果你堅持只要一個lib
10/17 22:54, 36F

10/17 22:54, , 37F
那就把所有lib打散再包吧..lib只是obj檔的打包檔案
10/17 22:54, 37F

10/17 22:55, , 38F
只做一個lib是辦得到的,但拜託別做這種蠢事
10/17 22:55, 38F

10/17 22:56, , 39F
如果別人連結了另一個lib也是包了同樣的東西進去
10/17 22:56, 39F

10/17 22:56, , 40F
linker會爆炸的
10/17 22:56, 40F

10/18 16:56, , 41F
lib只會把你在此lib裡的實作包進去
10/18 16:56, 41F

10/18 16:56, , 42F
你所參考的外部Lib檔的實作則不會包進去
10/18 16:56, 42F

10/18 16:57, , 43F
所以使用你lib的人必須要把你參考的lib也link起來
10/18 16:57, 43F

10/18 16:57, , 44F
不然就會找不到符號 出現連結錯誤
10/18 16:57, 44F

10/18 16:57, , 45F
如果你想要別人只link你的就OK 你可以包成dll
10/18 16:57, 45F

10/18 16:58, , 46F
dll會把你參考到的外部符號所有包進去 沒參考的不會
10/18 16:58, 46F
文章代碼(AID): #1EcxRbzi (C_and_CPP)