【问题标题】:xcode c/c++ linker error: undefined symbolxcode c/c++ 链接器错误:未定义的符号
【发布时间】:2015-09-19 01:55:21
【问题描述】:

我做了一些搜索,但我的问题似乎是微不足道的,所以没有人问。
我有一个混合的 c 和 c++ 代码。

model.h,我有以下声明:

void free_and_null (char **ptr);

model.cpp,我有函数体:

void free_and_null (char **ptr)
{
    if ( *ptr != NULL ) {
        free (*ptr);
        *ptr = NULL;
    }
} /* END free_and_null */

solve.c 文件中,我有以下内容:

#include "sort.h"
.....
    free_and_null ((char **) &x);

当我编译项目时,它有以下链接器错误:

换行) 架构 x86_64 的未定义符号: “_free_and_null”,引用自:

为什么这么简单的程序会出错?我使用 Apple LLVM 6.0 作为编译器。任何输入都受到高度赞赏。

【问题讨论】:

    标签: c++ c xcode macos debugging


    【解决方案1】:

    您需要告诉 C++ 编译器该函数应该具有“C”链接,方法是这样声明(在您的 C++ 源文件中)。

    extern "C" {
      void free_and_null (char **ptr);
    }
    

    C++ 编译器为函数构造“错位”名称,因此具有相同名称但参数类型不同的两个函数最终具有不同的错位名称;这是必要的,因为链接器希望所有名称都是唯一的。因此,您的示例中由 C++ 编译器生成的代码将生成与 C 编译器生成的名称不同的名称。 (在 Intel 平台上,C 编译器也会通过以下划线前缀稍微修改名称,这就是它抱怨 _free_and_null 未找到的原因。)

    这样做的一种常见方法是制作一个使用预处理器宏来检测语言的头文件。它不是完全可移植的,但它应该适用于您的情况:

    // File model.h
    // This will not work with all C++ compilers, but it works with clang and gcc
    #ifdef __cplusplus
    extern "C" {
    #endif
    
    void free_and_null (char **ptr);
    // Other function declarations here
    
    #ifdef __cplusplus
    }
    #endif
    

    【讨论】:

    • 谢谢你!有用!它唤起了我关于编译器和链接器的褪色记忆。但我还是不记得了,在 Xcode 中,.c 文件和 .c++ 文件是用不同的编译器编译的?我是 Xcode 的新手。我曾经使用 MS Visual Studio,它非常方便和有用。但是因为喜欢Macbook,所以我把所有的应用软件都搬到了mac os版本。 Xcode 似乎不如 MS Visual Studio 方便。你能推荐一些在mac os上进行C/C++编码的IDE吗?谢谢!
    • @user43964:它是相同的编译器套件 (clang),但名称修改是 ABI 的一部分,需要以不同方式处理 C 和 C++ 名称。我对windows了解不多,但如果它有所不同,我会感到惊讶。也许您的 Windows IDE 不允许您在项目中混合语言。如果您使用 c++ 编译 C 代码,它通常可以正常工作,并且您没有命名问题。就 mac os x 而言,我使用的唯一 IDE 是 xcode。
    猜你喜欢
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    • 2014-11-04
    • 1970-01-01
    • 1970-01-01
    • 2014-07-15
    • 1970-01-01
    • 2012-05-08
    相关资源
    最近更新 更多