Xcode链接静态和动态库

时间:2017-08-15 18:41:14

标签: c++ xcode static-libraries dylib dynamic-library

我在将macOS应用程序与C库链接时遇到了一些问题。 我有几个与此问题有关的问题。

  1. 最好将应用与动态或静态库相关联,考虑到这将是非常自定义的库,而不是与其他应用共享?

  2. 我已经将我的macOS Xcode应用程序与~14个静态库.a相关联,并且工作正常。我重新配置了CMakeLists.txt,使这个库和现在的Xcode项目不起作用。主要的变化是改变了我的目录

  3. "$(SRCROOT)/../../c/<project_name>/outputs/lib/apple/static"

    但现在我在同一路径中同时拥有静态(.a)和动态(.dylib)库     "$(SRCROOT)/../../c/server/outputs/lib/apple"

    我不知道这是否重要,但是对静态库的链接导致在运行我的Xcode项目后它抱怨它无法加载 lib.dylib 所以也许它在Library下找到这个动态库搜索路径和轮胎加载但没有找到它们链接?

    enter image description here

    1. 所以我厌倦了将Xcode macOS app与.dylib库联系起来而不是静态.a库将它们添加到Link Binary with Libraries中。问题是现在也没有找到库的错误。
    2. enter image description here

      也许我应该在这里改变一些事情?但是如果我将我的应用程序分发给其他一些在这个特定位置没有库的计算机。如何在Xcode包中包含动态库以便始终可以找到。

      enter image description here

      我知道我可能在很多问题上添加了。但是想知道如何最好地解决这个问题?最好静态或动态链接,然后如何正确实现这一点,避免此错误。

      更新

      1. 似乎在链接.dylib时,只有在我将此库目录的路径添加到Runpath Search Paths时,它才有效。
      2. 当我链接到静态库.a时,它似乎在.dylib不在同一目录中时工作(我将.a库移动到/static子目录中然后为此移动的库错误不再显示。但是当同一目录中有 .a .dylib 库时,是不是可以静态链接?

2 个答案:

答案 0 :(得分:1)

最后,我将这个Xcode macOS项目与多个动态C库(.dylib)相关联。

备注

为了与静态库链接(.a)它们不能与动态库并排放置! path/project_name/outputs/lib/apple/*.dylib然后在路径下放置静态库:path/project_name/outputs/lib/apple/static/.a如果XCode在构建设置中库搜索路径中找到它们,则会尝试链接动态库。

XCODE中的动态C图书馆链接

  1. 添加动态库到Build Phases选项卡和Link Binaries with Libraries部分,如图所示 enter image description here

  2. 将所有动态库嵌入到输出macOS Application Wrapper

  3. enter image description here

    1. 你得到这样的东西: enter image description here

    2. 然后在构建设置中添加库搜索路径

    3. enter image description here

      1. 最后在构建设置中添加运行时搜索路径
      2. enter image description here

答案 1 :(得分:1)

我知道这是一个老问题,但它是搜索谷歌搜索&#34; Xcode静态链接时的最佳结果之一。&#34;

我最近在与英特尔IPP集成时遇到了这个问题,英特尔IPP将静态库和动态库放在同一目录中。

如果我使用标准Xcode链接方法通过&#34; Build Phases |添加库Link Binary with Libraries,&#34; Xcode将该UI转换为如下所示的命令行:

clang++ ... -L/my/path -lstatic1 -lstatic2 ...

但是这会导致链接器更喜欢DLL而不是同一目录中的静态库。

我通过删除&#34; Build Phases |中的条目解决了这个问题Link Binary with Libraries&#34;窗口,并在&#34;构建设置|中添加库的完整相对路径其他链接器标志&#34;项:

../../path/to/lib/libstatic1.a ../../path/to/lib/libstatic2.a

这导致Xcode将UI转换为如下所示的命令行:

clang++ ... ../../path/to/lib/libstatic1.a ../../path/to/lib/libstatic1.a ...

静态链接库。