看板 C_and_CPP 關於我們 聯絡資訊
最近用VS2008弄一個自己寫的靜態庫給朋友 裡面有用的其他函式庫 然後我發現要用我寫的函式庫時 必須要把我有用到的其他函式庫的lib檔一起附給他 否則他無法使用 1. 難道沒有辦法只給我寫的lib檔嗎? 是我make的有問題還是? 2. 為什麼自己寫的lib檔要link; 而其他函式庫中的不用, 只要告知include目錄? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.44.83.157
diabloevagto:1.一定要給,你有用到其他lib的東西,不一起給,對方 10/17 13:17
diabloevagto:那邊使用到你的lib會不完全 10/17 13:17
感謝 另外順便問一下 如果我使用"inline" 能不能偷雞把對方已封裝的函式包進來
priv:我覺得這是根本觀念上的問題 10/17 13:20
priv:你要用到external的東西就一定要link,看從哪邊link的問題 10/17 13:20
priv:你build出來的library只會有你寫的程式的目的碼 10/17 13:23
priv:正常是不會幫你包進其它library的東西 10/17 13:23
priv:VC專案建起來的時候就有列出一些預設的函式庫了 10/17 13:25
priv:並不是只要inlcude就可以用,而是預設就會link 10/17 13:25
那我可以自己設定成預設link嗎?
priv:又或說你所謂的library是source release直接包在專案中 10/17 13:29
priv:編輯的時候直接幫你編好可以直接resolve到 10/17 13:30
priv:這樣就不需要特別去設定import library 10/17 13:30
這三行不太懂 可否詳述 感恩
purpose:VC的include目錄應該是找標頭檔用的 要 %LIBPATH% 才是 10/17 13:34
語意有誤Sorry, 是%LIBPATH%沒錯, 我好奇的是為什麼用其他函式庫時(不一定是標準函式庫) 都不需要在linker(相依性)那邊連結lib檔 但自己寫出來的要? 感謝解答 ※ 編輯: elfkiller 來自: 114.44.83.157 (10/17 13:42)
priv:因為他們的header裡面有指定好library name了 10/17 14:02
james732:你用哪個其他函式庫是不需要連結的…? 10/17 14:05
priv:例如#pragma comment( lib, "library" ) 10/17 14:05
priv:如果完全沒指定名稱compiler怎麼可能會曉得要去哪找 10/17 14:05
priv:所以我說是觀念的問題,不要用現象去導觀念 10/17 14:06
priv:而是要用正確的觀念去解釋現象 10/17 14:06
priv:如果同一個目錄下有不同版本的library 10/17 14:12
priv:照原po的想法可以只要加path就全部去搜尋,不就亂掉了 10/17 14:12
elfkiller:所以是因為一般函式庫都會在標頭檔加入pragma comment 10/17 14:54
elfkiller:我這樣理解的正確嗎? 10/17 14:54
elfkiller:也就是說如果用g++就要自己手動打? 10/17 14:55
james732:g++(該說Linux)通常是把.so檔放到系統的特定目錄 10/17 14:56
elfkiller:那.a檔呢? 對應於windows的.lib, 需要加-l指令嗎? 10/17 15:00
tropical72:我覺得你被 vc 養壞了 (還蠻常見的事) 10/17 17:28
tropical72:所有程式用到之 lib ,一定都要到齊,不論是 win/linux. 10/17 17:29
tropical72:而#pragma comment 是開放在程式碼裡指定連結的 lib. 10/17 17:30
tropical72:你即使不在程式碼裡寫,也可用 ide 設定,或在使用CL.exe 10/17 17:31
tropical72:(或Link.exe)時,指定引入lib(含指定path).g++如果可在 10/17 17:32
tropical72:程式碼裡,有類#pragma~之指令,你也不用再用下 -l 指令. 10/17 17:34
tropical72:結論是,雖vc讓人感覺平時沒連lib,但ide都做了預設動作. 10/17 17:36
tropical72:要在其它電腦執行時,所有lib都要到位. 10/17 17:37
sunneo:linux是可以把.a把他解壓縮為多個.o然後再重包啦... 10/17 19:26
sunneo:但那樣就不太對 10/17 19:27
scarsnight:雖然說..這真的不太對,不過如果你堅持只要一個lib 10/17 22:54
scarsnight:那就把所有lib打散再包吧..lib只是obj檔的打包檔案 10/17 22:54
littleshan:只做一個lib是辦得到的,但拜託別做這種蠢事 10/17 22:55
littleshan:如果別人連結了另一個lib也是包了同樣的東西進去 10/17 22:56
littleshan:linker會爆炸的 10/17 22:56
yayarice:lib只會把你在此lib裡的實作包進去 10/18 16:56
yayarice:你所參考的外部Lib檔的實作則不會包進去 10/18 16:56
yayarice:所以使用你lib的人必須要把你參考的lib也link起來 10/18 16:57
yayarice:不然就會找不到符號 出現連結錯誤 10/18 16:57
yayarice:如果你想要別人只link你的就OK 你可以包成dll 10/18 16:57
yayarice:dll會把你參考到的外部符號所有包進去 沒參考的不會 10/18 16:58