【问题标题】:Unable to link a static C library in an Obj-C project (Xcode 4.6.3)无法在 Obj-C 项目 (Xcode 4.6.3) 中链接静态 C 库
【发布时间】:2013-08-19 21:20:11
【问题描述】:

我正在尝试使用 libftp 构建一个基本的 FTP 客户端。我已将其编译并存档为libftp.a,并将其放在/usr/local/lib 中。我在/usr/local/include/ftp 中放置了所有必要的标头。

在构建设置下,我已将“标题搜索路径”设置为 /usr/local/include,并将“库搜索路径”设置为 /usr/local/lib。对于“其他链接器标志”,我添加了-lftp

这是我的 C++ 类的外壳:

Connector.h:

#include <stdlib.h>
#include <ftp/ftp.h>
#include <stdio.h>

class Connector{
    private:
        FtpConnection *connection;
    public:
        Connector();
        ~Connector();

        bool connect(const char *hostname, const char *port);
    };

Connector.cc:

#include "Connector.h"

Connector::Connector(){
    }

Connector::~Connector(){
    }

bool Connector::connect(const char *hostname, const char *port){
    ftpGetAddresses(hostname, port);
    printf("Connected!\n");
    return true;
    }

在编译时,这是我得到的错误:

架构 x86_64 的未定义符号:“ftpGetAddresses(char const*, char const*)",引用自: Connector.o ld 中的 Connector::connect(char const*, char const*):未找到架构 x86_64 clang 的符号:错误:链接器 命令失败,退出代码为 1(使用 -v 查看调用)

可能值得注意的是,这是 Cocoa 项目的一部分,所以我的 AppDelegate 中的 Connector 类是 #included,这当然是一个 Obj-C 类。我所有的 Obj-C 源文件都有 .mm 扩展名。

我确定该库正常工作,因为我在命令行上使用gcc ... -lftp 编译程序没有问题。这只是 Xcode 的问题。

【问题讨论】:

    标签: objective-c xcode linker static-libraries


    【解决方案1】:

    好吧,看来我只是通过自己的问题与自己交谈。当我输入问题的最后一部分时,我意识到问题是在 C++ 源文件中链接 C 库。 gcc 可以在命令行上正常编译,但 g++ 给了我与 Xcode 相同的错误。谷歌搜索后我找到了this link,很好地解决了我的问题。基本上,如果你想让 C 库与 C++ 兼容,你需要添加

    #ifdef __cplusplus
    extern "C" {
    #endif
    

    在库头文件的顶部,并添加

    #ifdef __cplusplus
    }
    #endif
    

    在文件的底部。我将把问题留在这里,希望将来能对其他人有所帮助。

    【讨论】:

      猜你喜欢
      • 2017-11-25
      • 2017-01-31
      • 1970-01-01
      • 2019-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-27
      • 1970-01-01
      相关资源
      最近更新 更多