C++ 针对静态和动态库的Xcode链接

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)和动态

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

  • 考虑到这将是非常定制的库,而不是与其他应用程序共享,最好将应用程序链接到动态或静态库

  • 我已经将我的macOS Xcode应用程序与14个静态库进行了链接。a而且运行良好。我已经重新配置了CMakeLists.txt来创建这个库,现在Xcode项目不起作用了。主要的更改是更改我的目录

  • “$(SRCROOT)/../c///outputs/lib/apple/static”

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

    我不知道这是否重要,但针对静态库的链接会导致在运行我的Xcode项目后,它抱怨它无法加载lib.dylib,所以它可能会在库搜索路径下找到这个动态库,并尝试加载它们,但没有找到链接

  • 所以我尝试将Xcode macOS应用程序链接到.dylib库,而不是static.a库,并将它们添加到带有库的链接二进制文件中。问题是现在也会发生找不到库的错误
  • 也许我应该在这里换些东西?但是,如果我将我的应用程序分发到其他一些在这个特定位置没有库的计算机上,该怎么办呢。如何在Xcode捆绑包中包含动态库,以便始终可以找到

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

    更新

  • 似乎在针对
    .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命令行?请查看以下内容: