在Xcode 4上增强库静态链接

时间:2012-03-06 15:45:31

标签: xcode boost static-linking

我正在使用Xcode在OS X上使用Boost库。使用macports在我的系统上安装了Boost。我已经成功构建了我的应用程序,将我需要的3个boost库(例如,libboost_thread-mt.a)添加到Targets的Link Binary With Libraries列表中。但是我需要静态链接这些库,以便应用程序可以在其他计算机上运行,​​而无需安装boost库。

我该怎么做?通过我的众多谷歌搜索我发现我可能需要添加'-static' - 我在Xcode中添加它?

1 个答案:

答案 0 :(得分:7)

如果您已与.a库关联,那么您已经静态链接。您永远不需要发送.a个库。它们只是一堆物体。


编辑:您的错误强烈暗示您要链接dylib而不是.a。如果您的图书馆路径中有libfoo.dyliblibfoo.a,即使您在Xcode中说“link libfoo.a”,即使libfoo.a在搜索路径中较早,仍会链接libfoo.dylib。这是因为Xcode的链接完全被破坏并将-lfoo传递给链接器(你不应该对你构建的东西使用-l并且具有确切的路径)。我总是建议将您在LDFLAGS中构建的库链接到xcconfig文件中,而不是使用构建窗格。您传递了所需的确切路径,而不是使用-l。有关xcconfig的更多想法,请参阅Abandoning the Build Panel。它现在已经过时了,因为它是为Xcode3编写的,但基础仍然适用。

使用构建窗格,您还可以将整个路径传递到“其他链接器标志”中的库。但是这仍然存在构建窗格的所有问题。

更快(但不太健壮)的解决方案有时会将-Wl,-search_paths_first添加到“其他链接器标志”。这会更改行为,以便在继续之前搜索.dylib.a的每个库路径(默认行为是搜索.dylib的所有位置,然后搜索.a })。因此,如果您的.a.dylib位于不同的目录中,并且该目录位于搜索路径的前面,那么这将有效。

这个问题终于让我在这个问题上开了一个radar,这是我多年前应该做的。我建议其他人打开duplicates