Objective c 如何在Cocoa应用程序中正确包装C库

Objective c 如何在Cocoa应用程序中正确包装C库,objective-c,c,xcode,xcode4,Objective C,C,Xcode,Xcode4,我想在我的Cocoa应用程序中包括GNU科学库(GSL),这样用户就不需要首先在本地安装它。与大多数GNU软件包一样,它是标准的configure/make/makeinstall例程。但这是行不通的: ./configure --prefix ~/libgsl make make install 因为前缀是我的计算机本地的。这也不是: ./configure --prefix (path to build folder)/libgsl make make install 我想要的基本上是G

我想在我的Cocoa应用程序中包括GNU科学库(GSL),这样用户就不需要首先在本地安装它。与大多数GNU软件包一样,它是标准的
configure
/
make
/
makeinstall
例程。但这是行不通的:

./configure --prefix ~/libgsl
make
make install
因为前缀是我的计算机本地的。这也不是:

./configure --prefix (path to build folder)/libgsl
make
make install
我想要的基本上是GSL完全包含在我的应用程序中,并且我可以在用户不下载任何其他内容的情况下调用它的函数


我是从.NET过来的,对Xcode 4和Clang/GCC的构建系统相当陌生。非常感谢您的帮助。

假设没有框架风格的库构建,与第三方库绑定时通常采用的方法是正常构建包,将其安装在
/usr/local
中,并将您的项目配置为包含并从中链接。不过,建筑是最简单的部分

棘手的部分是正确地捆绑
.app
。您需要添加一个自定义构建阶段(在其他阶段之后),首先将所有相关的
.dylib
文件复制到应用程序包的Frameworks文件夹中(使用环境变量提供帮助;请参阅Xcode文档)。然后,您需要使用
install\u name\u 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下发布的,因此您的应用程序需要类似地发布才能遵守许可证。提供源代码是必要的,但不足以满足法规遵从性。

我认为只需运行
/configure
生成
config.h
头文件,然后将所有源文件(最好保留其目录结构)复制到app/Xcode项目中就足够了。感谢@gavinb的提示,我正在浏览诺基亚的文档,并将结果发布在这里,供未来所有的谷歌用户使用。顺便说一句,这是我硕士论文的一个学校项目,所以GPL不是一个问题。我刚刚发现我的一个老项目就是这样做的(嵌入GSL),所以我在上面粘贴了一些工作代码,这些代码正是你需要的。通过使用它,您可以在您喜欢的任何目录中构建和安装GSL,并像平常一样链接,留下脚本来修复引用,这样您就有了一个自包含的应用程序(只使用相对路径)。