xcode c/c++链接器错误:未定义的符号

xcode c/c++ linker error: undefined symbol

本文关键字:未定义 符号 错误 c++ 链接 xcode      更新时间:2023-10-16

我做了一些搜索,但我的问题似乎很小,所以没有人问
我有一个混合的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"链接,方法是(在C++源文件中)声明它。

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

C++编译器为函数构造"损坏"的名称,这样两个名称相同但参数类型不同的函数最终会有不同的损坏名称;这是必要的,因为链接器希望所有名称都是唯一的。因此,在您的示例中,C++编译器生成的代码将产生与C编译器生成的名称不同的名称。(在英特尔平台上,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