2013-07-01 45 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

相关问题