Xcode链接静态库和动态库。

7

我在将我的macOS应用程序与C库链接时出现了一些问题。以下是与此问题相关的几个问题。

  1. 考虑到这将是非共享的自定义库,最好使用动态库还是静态库来链接应用程序?

  2. 我已经将我的macOS Xcode应用程序连接到了大约14个静态库.a上,它可以正常工作。我重新配置了CMakeLists.txt以使这些库,并且现在Xcode项目无法工作。主要更改是我更改的目录:

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

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

我不知道这是否有影响,但是链接静态库会导致在运行我的Xcode项目后它抱怨无法加载lib.dylib,因此也许它在Library Search Paths下找到这个动态库并尝试加载它们,但无法找到它们的链接?

enter image description here

  1. 因此,我尝试将Xcode macOS应用程序链接到.dylib库,而不是静态的.a库,并将它们添加到“Link Binary with Libraries”中。问题是现在也出现找不到库的错误。

enter image description here

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

enter image description here

我知道我可能提出了太多问题。但是想知道如何最好地解决这个问题?最好是静态链接还是动态链接,然后如何正确实现避免此错误。

更新

  1. 当链接.dylib时,似乎只有在将此库目录的路径添加到Runpath Search Paths中时才起作用。
  2. 当我链接静态库.a时,看起来它工作正常,即使.dylib不在同一目录中(我将.a库移动到/static子目录中),然后为这个移动后的库错误不再显示。但是,是否有一种方法可以在具有相同目录下的.a.dylib库时进行静态链接?
2个回答

8
最后,我将这个Xcode macOS项目与多个动态C库(.dylib)链接起来了。
备注:
为了与静态库(.a)链接,它们不能和动态库放在一起!将动态库放在路径path/project_name/outputs/lib/apple/*.dylib下,然后在路径path/project_name/outputs/lib/apple/static/.a下放置静态库。因为XCode会尝试链接动态库,如果在Build Settings中的Libraries Search Path中找到它们。
在XCode中链接动态C库:
1. 将动态库添加到“Build Phases”选项卡和“Link Binaries with Libraries”部分(如图)。 enter image description here 2. 将所有的动态库嵌入输出的macOS应用程序包装器。
3. 如下所示: enter image description here
4. 在构建设置中添加“Libraries Search Paths”。
5. 最后,在构建设置中添加运行时搜索路径。
如下所示: enter image description here

7

我知道这是一个老问题,但当在谷歌搜索“Xcode静态链接”时,它是搜索结果中排名前几的问题之一。

最近,在与Intel IPP集成时遇到了这个问题,因为它将静态库和动态库放在同一个目录中。

如果我使用标准的Xcode链接方法,通过"Build Phases | Link Binary with Libraries"添加库,Xcode将把该UI转换成如下命令行:

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

但这会导致链接器优先选择同一目录下的DLL而不是静态库。
我通过从“Build Phases | Link Binary with Libraries”窗口中删除条目,并在“Build Settings | Other linker flags”条目中添加完整的相对路径来解决了这个问题。
../../path/to/lib/libstatic1.a ../../path/to/lib/libstatic2.a

这导致 Xcode 将用户界面翻译成一个看起来像这样的命令行:
clang++ ... ../../path/to/lib/libstatic1.a ../../path/to/lib/libstatic1.a ...

这将静态链接库。


1
一个单独的问题。如何获取从Xcode更改生成的clang命令行? - Mervyn Ong
请查看以下链接:https://dev59.com/Il0a5IYBdhLWcg3wqaVS - Avi Tevet
这个问题怎么还没解决?如果我在“Build Phases”下明确选择静态库进行链接,它仍然使用错误的库?WTF? - Picard

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