2013-07-01 42 views
0

我想在我的Cocoa應用程序中包含GNU科學庫(GSL),以便用戶不需要先在本地安裝它。像大多數GNU軟件包一樣,它是標準的例程。但這是行不通的:如何在Cocoa應用程序中正確包裝C庫

./configure --prefix ~/libgsl 
make 
make install 

由於前綴是我的電腦的本地。也不是這樣的:

./configure --prefix (path to build folder)/libgsl 
make 
make install 

我想基本上是GSL在我的應用程序完全被遏制,我可以調用它的功能,不需要用戶下載任何東西。

我對Xcode 4和Clang/GCC的構建系統都比較陌生,它們都是從.NET開始的。任何幫助深表感謝。

+0

我認爲通過只運行'./configure'就可以生成'config.h'頭文件,然後將所有的源文件(最好保存好目錄結構)複製到app/Xcode項目中。 – 2013-07-01 12:29:20

回答

1

假設沒有框架構建的庫,通常在與第三方庫捆綁時完成的方式是按照正常方式構建包,將其安裝在/usr/local中,並將項目配置爲包含並鏈接從那裏。建築雖然很容易。

棘手的部分是正確捆綁.app。您需要添加一個自定義構建階段(在其他應用程序之後),首先將所有相關的.dylib文件複製到應用程序包的Frameworks文件夾中(使用環境變量提供幫助;請參閱Xcode文檔)。然後,您需要使用install_name_tool來獲取應用程序二進制文件以查找框架目錄(因爲嵌入式soname仍然認爲它在/usr/local)。這部分非常複雜,沒有很好的文檔記錄。

我剛從一個使用GSL的工作項目中提取了這個。只需添加這是在您的Xcode項目作爲自定義腳本一個額外的構建階段:

# Framework folder for Example.app 
FRAMEWORKS_DIR=${TARGET_BUILD_DIR}/Example.app/Contents/Frameworks 

# Create path if it doesn't exsit 
mkdir -p ${FRAMEWORKS_DIR} 

# Find the original linked path for libgsl 
GSLLIB=`otool -L ${TARGET_BUILD_DIR}/Example.app/Contents/MacOS/Example | grep libgsl | cut -d" " -f1` 
GSLPATH=`dirname $GSLLIB` 

# Copy the dylibs into your app 
cp /usr/local/lib/lib{gsl,gslcblas}.0.dylib ${FRAMEWORKS_DIR} 

# Update embedded paths 
install_name_tool \ 
    -change ${GSLPATH}/libgsl.0.dylib \ 
    @executable_path/../Frameworks/libgsl.0.dylib \ 
    ${TARGET_BUILD_DIR}/Example.app/Contents/MacOS/Example 

這應該與您的應用程序名稱的一個簡單的替換工作。

這基本上是一樣的,你需要做的,建立一個獨立的Qt應用程序是什麼,所以這裏的文檔是非常相關的:

值得一對捆綁讀了,框架和包裝。例如:

這篇文章也有關:

注意GSL是在GPL下發布的,所以您的應用程序將需要爲了尊重許可證,要進行類似的公佈。運送來源是必要的,但不足以滿足合規性。

+0

感謝提示@gavinb,我正在瀏覽諾基亞的文檔,並將在此發佈所有未來Google員工的結果。順便說一句,這是我的碩士論文的學校項目,所以GPL不是問題。 –

+0

我剛剛發現了一個我的舊項目(嵌入GSL),所以我在上面粘貼了一些可以滿足您需要的工作代碼。通過使用這個,你可以在你喜歡的任何目錄中構建和安裝GSL,並且只需要像平常一樣鏈接,讓腳本修復引用,這樣你就擁有了一個獨立的應用程序(只使用相對路徑)。 – gavinb

相關問題