在Xcode 4上进行Boost库静态链接

5
我正在使用Boost库在OS X上使用Xcode。Boost是通过macports安装在我的系统上的。我成功地构建了我的应用程序,通过将我需要的3个boost库(例如libboost_thread-mt.a)添加到目标的“链接二进制文件与库”列表中。但是,我需要静态链接这些库,以便应用程序在其他计算机上运行时不需要安装boost库。
我该怎么做呢?通过我的众多谷歌搜索,我发现我可能需要添加“-static”,我应该在Xcode中添加在哪里?
1个回答

7
如果你已经链接了一个.a库,那么你已经静态链接了。你不需要将.a库发送出去,因为它们只是对象的捆绑包。
编辑: 你的错误强烈表明你正在链接dylib而不是.a文件。如果在你的库路径中有libfoo.dyliblibfoo.a,即使你在Xcode中说“链接libfoo.a”,并且即使libfoo.a位于搜索路径前面,它仍然会链接到libfoo.dylib。这是因为Xcode的链接是完全错误的,并将-lfoo传递给链接器(对于你构建并具有精确路径的东西,你应该永远不要使用-l)。我总是建议在xcconfig文件的LDFLAGS中链接你构建的库,而不是使用构建窗格。你可以传递你想要的精确路径,而不是使用-l。更多关于xcconfig的信息,请参见Abandoning the Build Panel。它已经过时现在已经针对Xcode3编写,但基础知识仍然适用。
使用构建窗格,你还可以在“其他链接器标志”中传递整个库的路径。但这仍然有构建面板的所有问题。
更快(但不太健壮)的解决方案有时是将-Wl,-search_paths_first添加到“其他链接器标志”中。这会改变行为,使得每个库路径在继续搜索之前都会搜索.dylib.a(默认行为是在任何地方搜索.dylib,然后只搜索.a)。因此,如果你的.a.dylib位于不同的目录中,并且该目录在搜索路径中较早,那么这将起作用。
这个问题最终让我打开了一个雷达,虽然我多年前就应该这样做了。我建议其他人也打开重复项

尽管如此,当我尝试在另一台计算机上运行应用程序时,应用程序无法运行,并出现错误,指出它无法定位相关的.dylib文件。.a文件是否应该链接到项目中的其他位置而不是在“链接二进制文件与库”部分中? - Liam Lacey
使用构建面板,您还可以在“其他链接器标志”中传递库的完整路径。这解决了问题。谢谢! - Liam Lacey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接