xcode c/c++链接器错误:未定义的符号
xcode c/c++ linker error: undefined symbol
我做了一些搜索,但我的问题似乎很小,所以没有人问
我有一个混合的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
相关文章:
- vscode g++链路故障:体系结构x86_64的未定义符号
- 体系结构x86_64的未定义符号:std:terminate(),typeinfo,运算符delete[],运算符new
- C++ 中 dlsym 的未定义符号
- 仅在 MacOS 上析构函数的未定义符号
- OSX clang++:用于 cpp 文件中显式实例化模板的体系结构x86_64的未定义符号
- PCL 出错:体系结构x86_64 @pcl的未定义符号
- clang:错误:链接器命令失败,退出代码为 1(使用 -v 查看调用) - 体系结构的未定义符号 x86_64:
- 体系结构x86_64的未定义符号:链接器错误
- C++ std::vector<int> 体系结构的未定义符号 x86_64:
- 生成文件:体系结构x86_64的未定义符号
- libc++abi未定义符号:_ZTVN10__cxxabif120__si-class_type_infoE
- Xcode"体系结构x86_64的未定义符号"
- 体系结构x86_64的未定义符号:找不到原因
- SWIG链接器:未定义符号:_ZN2cv8fastFreeEPv(cv::fastFree(void*))
- 如何修复架构x86_64的未定义符号,Boost Asio 1.58
- 在Qt5上去静态库:架构的未定义符号x86_64:
- 体系结构x86_64的未定义符号:c++/ h 文件和 cpp 文件
- 监视 SDK 下的未定义符号"__Unwind_SjLj_Unregister"
- 使用 Boost/Python 的未定义符号 - 复杂
- 建筑x86_64的未定义符号:"vtkDebugLeaksManager::vtkDebugLeaksManager()",引用自: