C++ 针对静态和动态库的Xcode链接
我在将macOS应用程序与C库链接时遇到一些问题。 我有几个关于这个问题的问题C++ 针对静态和动态库的Xcode链接,c++,xcode,static-libraries,dylib,dynamic-library,C++,Xcode,Static Libraries,Dylib,Dynamic Library,我在将macOS应用程序与C库链接时遇到一些问题。 我有几个关于这个问题的问题 考虑到这将是非常定制的库,而不是与其他应用程序共享,最好将应用程序链接到动态或静态库 我已经将我的macOS Xcode应用程序与14个静态库进行了链接。a而且运行良好。我已经重新配置了CMakeLists.txt来创建这个库,现在Xcode项目不起作用了。主要的更改是更改我的目录 “$(SRCROOT)/../c///outputs/lib/apple/static” 但现在我在同一路径中同时拥有静态(.a)和动态
“$(SRCROOT)/../c///outputs/lib/apple/static”
但现在我在同一路径中同时拥有静态(.a)和动态(.dylib)库
“$(SRCROOT)/../c/server/outputs/lib/apple”
我不知道这是否重要,但针对静态库的链接会导致在运行我的Xcode项目后,它抱怨它无法加载lib.dylib,所以它可能会在库搜索路径下找到这个动态库,并尝试加载它们,但没有找到链接
.dylib
进行链接时,它只在我将此库目录的路径添加到运行路径搜索路径时起作用李>
当我链接静态库.a
时,当.dylib
不在同一目录下(我将.a
库移动到/static
子目录)时,它似乎也会起作用,而对于这个移动的库,不再显示错误。但是,当同一目录中有.a和.dylib库时,难道没有静态链接的方法吗李>
最后,我将这个Xcode macOS项目与多个动态C库(.dylib)链接起来
备注
为了链接静态库(.a),它们不能与动态库并排放置path/project\u name/outputs/lib/apple/*.dylib
然后将静态lib放在path:path/project\u name/outputs/lib/apple/static/.a
下,因为XCode试图链接动态库,如果它们在构建设置中的库搜索路径中找到它们。
XCODE中的动态C库链接
如图所示,将动态库添加到构建阶段选项卡,并将二进制文件链接到库部分
将所有这些动态库嵌入到输出macOS应用程序包装器中
你会得到这样的结果:
然后在生成设置中添加库搜索路径
最后在生成设置中添加运行时搜索路径
我知道这是一个老问题,但在谷歌搜索“Xcode静态链接”时,这是最重要的结果之一
我最近在与Intel IPP集成时遇到了这个问题,它将静态和动态LIB放在同一个目录中
如果我使用标准的Xcode链接方法,通过“Build Phases | Link Binary with Libraries”添加库,Xcode会将该UI转换为如下所示的命令行:
clang++ ... -L/my/path -lstatic1 -lstatic2 ...
clang++ ... ../../path/to/lib/libstatic1.a ../../path/to/lib/libstatic1.a ...
但这会导致链接器更喜欢DLL而不是同一目录中的静态库
我通过从“构建阶段|使用库链接二进制文件”窗口中删除条目,并在“构建设置|其他链接器标志”条目中添加库的完整相对路径来解决此问题:
这导致Xcode将UI转换为如下所示的命令行:
clang++ ... -L/my/path -lstatic1 -lstatic2 ...
clang++ ... ../../path/to/lib/libstatic1.a ../../path/to/lib/libstatic1.a ...
静态链接库。另一个问题。如何获取由Xcode更改生成的clang命令行?请查看以下内容: