【问题标题】:Boost library static linking on Xcode 4在 Xcode 4 上提升库静态链接
【发布时间】:2012-03-06 15:45:31
【问题描述】:

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

我该怎么做呢?通过我的大量谷歌搜索,我发现我可能需要添加“-static”——我在 Xcode 中的哪个位置添加它?

【问题讨论】:

    标签: xcode boost static-linking


    【解决方案1】:

    如果您已链接到 .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 位于不同的目录中,并且该目录位于搜索路径的较早位置,这将起作用。

    这个问题终于让我在这个问题上打开了radar,我应该在几年前就这样做了。我建议其他人打开duplicates

    【讨论】:

    • 这就是我的想法,但是当尝试在另一台计算机上运行该应用程序时,该应用程序将无法运行并出现错误,指出它无法找到相关的 .dylib 文件。 .a 文件是否应该在“Link Binary With Libraries”部分之外的其他地方链接到项目?
    • “使用构建窗格,您还可以将整个路径传递到“其他链接器标志”中的库。 - 这解决了问题。谢谢!
    猜你喜欢
    • 2011-01-20
    • 2011-07-15
    • 1970-01-01
    • 2011-09-01
    • 1970-01-01
    • 2018-01-23
    • 2015-01-28
    • 1970-01-01
    • 2012-06-29
    相关资源
    最近更新 更多