Mic*_*bro 7 c++ xcode dylib static-libraries dynamic-library
我在将 macOS 应用程序与 C 库链接时遇到一些问题。我有几个与这个问题相关的问题。
考虑到这将是非常自定义的库而不是与其他应用程序共享,最好将应用程序链接到动态或静态库?
我已将我的 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所以也许它在库搜索路径下找到了这个动态库并且厌倦了加载它们但不'没有发现它们有联系吗?
也许我应该在这里改变一些东西?但是,如果我将我的应用程序分发到其他一些在此特定位置没有库的计算机,该怎么办?如何在 Xcode 包中包含动态库以便始终可以找到。
我知道我可能添加了很多问题。但想知道如何最好地解决这个问题?最好静态或动态链接,然后如何正确实现此目的以避免此错误。
更新
.dylib只有当我将此库目录的路径添加到Runpath Search Paths..a它在.dylib不在同一目录中时可以工作(我将.a库移动到/static子目录中),然后对于这个移动的库错误不再显示。但是,当同一目录中有.a和.dylib库时,是否有办法静态链接?最后,我将此 Xcode macOS 项目与多个动态 C 库 (.dylib) 链接起来。
评论
为了与静态库(.a)链接,它们不能与动态库并排放置!path/project_name/outputs/lib/apple/*.dylib然后将静态库放在路径下:path/project_name/outputs/lib/apple/static/.a当 XCode 尝试链接动态库时,如果它们在构建设置中的库搜索路径中找到它们。
Xcode 中的动态 C 库链接
我知道这是一个老问题,但它是在谷歌搜索“Xcode static linking”时的最佳结果之一。
我最近在与 Intel IPP 集成时遇到了这个问题,它将静态和动态库放在同一目录中。
如果我使用标准 Xcode 链接方法通过“Build Phases | Link Binary with Libraries”添加库,Xcode 会将该 UI 转换为如下所示的命令行:
clang++ ... -L/my/path -lstatic1 -lstatic2 ...
Run Code Online (Sandbox Code Playgroud)
但这会导致链接器更喜欢 DLL 而不是同一目录中的静态库。
我通过从“Build Phases | Link Binary with Libraries”窗口中删除条目,并在“Build Settings | Other linker flags”条目中添加到库的完整相对路径来解决此问题:
../../path/to/lib/libstatic1.a ../../path/to/lib/libstatic2.a
Run Code Online (Sandbox Code Playgroud)
这导致 Xcode 将 UI 转换为如下所示的命令行:
clang++ ... ../../path/to/lib/libstatic1.a ../../path/to/lib/libstatic1.a ...
Run Code Online (Sandbox Code Playgroud)
它静态链接库。