【问题标题】:Proper Xcode settings正确的 Xcode 设置
【发布时间】:2016-03-26 23:16:38
【问题描述】:

我有 Xcode 5.1.1,并正在尝试创建一个项目来构建我的 OSX 应用程序。

应用结构如下:

我有一个静态链接库 (.a)、2 个动态链接库 (.dylib),它依赖于静态链接库、1 个动态链接库 (.dylib),它依赖于这 2 个动态库和使用那 1 个动态库 (.dylib)。

在 Xcode 中,我通过转到“Xcode ->Preferences->Derived Data (Advanced)”更改了输出目录。在那里我选择了“自定义->相对于工作区”。这样,所有内容都将保存在一个地方。

现在的问题是:我在将“.a”库添加到“.dylib”之一时遇到了困难。

我在 Xcode 窗口的左上角选择了一个目标,以便显示构建属性。然后在“搜索”窗口中输入“其他链接器标志”。然后我在“构建设置窗口”中选择“其他链接器标志”并输入“-ldbinterface.a”。尝试编译时出现错误:“ld: library not found for -llibdbinterface.a”。

接下来我尝试添加以下行:“-L/Users/igorkorot/dbhandler/dbhandler/Build/Products/Debug”到“Other Linker Flags”。但我得到了完全相同的错误。

接下来,我尝试删除这两行并将“libdbinterface.a”添加到“其他链接器标志”中。这次我得到:“clang:错误:没有这样的文件或目录”。

作为参考,该文件确实存在:

Igors-MacBook-Air:Debug igorkorot$ pwd
/Users/igorkorot/dbhandler/dbhandler/Build/Products/Debug
Igors-MacBook-Air:Debug igorkorot$ ls -la
total 384
drwxr-xr-x  3 igorkorot  staff     102 Mar 26 18:37 .
drwxr-xr-x@ 3 igorkorot  staff     102 Mar 26 18:36 ..
-rw-r--r--  1 igorkorot  staff  193528 Mar 26 18:37 libdbinterface.a

我做错了什么?在我的情况下添加静态库的正确方法是什么?

谢谢。

【问题讨论】:

    标签: c++ xcode static-libraries static-linking


    【解决方案1】:

    如果静态库的文件名是:

    libdbinterface.a
    

    然后您需要通过剥离前导 lib 和文件扩展名 (.a) 将其指定给 -l 链接器选项:

    -ldbinterface
    

    但是我看到了麻烦,因为我认为您可能会发现重复的符号定义(链接器错误或运行时问题),因为静态库中的符号将出现在两个动态库中。 p>

    有两种解决方法:

    1. 使静态库动态化。
    2. 编译动态库,将默认隐藏符号设置为(在构建设置 > 代码生成 ) 并且仅通过使用以下方法注释方法来公开要导出的符号:

      __attribute__ ((visibility ("default")))
      

    你通常会用宏来做:

    #define EXPORT __attribute__ ((visibility ("default")))
    

    并且在函数/变量中仅声明使用这种形式:

    extern EXPORT void aFunction(int someParam);
    

    注意:对于 Objective-C 类,您不需要这样做,但对于 C++ 可能需要这样做(我不记得了)。

    【讨论】:

    • 我实际上找到了更简单的解决方案——至少我是这么认为的。我刚刚选择了“Build Phases”并将静态库添加到“Link Binary With Libraries”。然后编译工作。不过,感谢您的解决方案。
    猜你喜欢
    • 2012-02-26
    • 2010-10-30
    • 2011-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-18
    • 2016-08-26
    相关资源
    最近更新 更多