2009-01-19 113 views
11

我的Xcode目標鏈接針對hdf5庫(使用Link Binary with Libraries構建階段)。 libhdf5是使用MacPorts安裝的,因此/ opt/local/lib包含庫的動態(.dylib)和靜態(.a)版本。強制鏈接到Xcode目標的庫的靜態鏈接?

構建的文本輸出顯示在構建的鏈接步驟中存在(如預期的)-lhdf5。但是,gcc似乎將動態鏈接庫視爲靜態鏈接庫。有沒有辦法強制gcc(通過編譯器開關或通過Xcode)靜態鏈接到libhdf5.a?

我發現的唯一解決方案是將libhdf5.a複製到項目(或其他)目錄並鏈接到該副本,從而避免在同一位置有動態和靜態版本。

+0

我很想看到一些更新,這個問題的答案並附有關於更新版本Xcode的說明。 – livingtech 2017-11-28 22:30:27

回答

7

在反應上愛德華Wirch的回答您的評論:您還可以控制靜態鏈接只此一個庫,如果通過更換-lhdf5 - l /完整/路徑/到/ libhdf5.a

1

使用「-static」開關連接: GCC link options

+0

這會強制所有庫的靜態鏈接,還是它的應用程序可以在每個庫的基礎上進行控制? – 2009-01-21 06:13:14

+0

實際上它會鏈接所有靜態庫。 – 2009-01-21 12:12:08

13

有這個完全相同的問題,儘管這是一箇舊的帖子,我想我會分享我必須做的這個工作。

通常你只是提供開關'-static'給鏈接器,但是,使用Xcode會導致包括crt在內的所有庫都靜態鏈接。我得到了錯誤:

can't locate file for: -lcrt0.o 

當我試過這個。

這爲我工作的事情是取代:

-lmylib 

/path/to/libmylib.a

注:-l被丟棄。

3

我和Xcode 4.5案例:

當我拖放一個靜態C庫(第三方庫與GNU Autotools的編譯)項目的框架(Project Navigator > Frameworks)的鏈接似乎認爲這是一個動態庫,並增加了-L -l標誌:因爲沒有/path/to/libfoodir/libfoo.dylib

-L/path/to/libfoodir -lfoo 

鏈接失敗。 鏈接器命令可以看出:

Log Navigator > select a Build log > select a Link line and expand it 

的連接成功時,我添加完整路徑(/path/to/libfoodir/libfoo.a)的連接器設置:

Targets > Build Settings (all) > Other linker flags