从 C 代码链接错误调用 C++ 函数(使用 gcc 进行链接)
Calling C++ function from C code linkage errors (using gcc for linking)
我正在用 C++ 编写一个 "library",它应该也被 C 代码使用。我遵循了这样的过程:
- 使用 g++ 和 gcc 编译器(因为它们是兼容的)。
- 在 C 代码使用的函数中使用 extern "C"
。
- 我的顶层使用了一个带有签名的包装函数,可以被 C 编译器理解。
- 将 C++ 代码(使用 g++)编译为 objective 文件。
- 使用 gcc 编译了我的客户端代码文件。
- 编辑:Tried/want 到 link 使用 gcc(或 ld)(而不是 g++)。
MCV 示例 如下:
mymalloc.h
#include <stdlib.h> /* for size_t */
#ifdef __cplusplus
extern "C"
#endif
void *mymalloc(size_t cbytes);
#ifdef __cplusplus
extern "C"
#endif
void myfree(void *ptr);
allocator.cpp
#include "allocator.h"
#include "mymalloc.h"
Allocator * Allocator::instance = 0;
extern "C" void *mymalloc(size_t cbytes){
Allocator *allocator = Allocator::getInstance();
return allocator->allocateFor(cbytes);
}
extern "C" void myfree(void *ptr){
Allocator *allocator = Allocator::getInstance();
allocator->freePtr(ptr);
}
...
该源文件定义了 C 代码要使用的函数,以及 allocator.h
的方法,它本身包含其他 C++ 内容。
我的 C 客户端文件(cclient.c)是:
#include <stdio.h>
#include "mymalloc.h"
int main(void){
void *p = mymalloc(500);
printf("%p\n", p);
return 0;
}
我的印象是,因为我在顶层有那些包装函数,而且它们的声明可以通过 C 代码查看,所以一切都应该没问题,但我收到 linking 错误:([=显示 59=])
./libmymalloc.a(allocator.o): In function `Allocator::getInstance()':
allocator.cpp:(.text+0x3cf): undefined reference to `operator new(unsigned long)'
allocator.cpp:(.text+0x3fa): undefined reference to `operator delete(void*, unsigned long)'
./libmymalloc.a(allocator.o):(.data.DW.ref.__gxx_personality_v0[DW.ref.__gxx_personality_v0]+0x0): undefined reference to `__gxx_personality_v0'
为了清楚起见,我编译和 linking 的方式是
g++ -c allocator.cpp
... (same for the rest .cpp files)
gcc -c cclient.c
gcc cclient.o allocator.o ...(all other c++ objectives)...
Edit(前三个答案之后):我知道我可以 link 使用 g++。我会对如何使用 C 编译器 link 感兴趣,这样只有 gcc 和 objectives(或其中的库)可用的人可以自己 link。
(这个问题可能是重复的,但我已经阅读了 SO 中的所有其他问题,我无法推断出我做错了什么。)
这看起来像分配器 Allocator
使用 new 和 delete,并且 link 不包含 C++ 库来满足缺少的功能。
您没有 post 您的命令行,但我认为那些命令行中缺少 -lstdc++(由 g++ 自动调用)。
您的问题在这里:
gcc cclient.o allocator.o ...(all other c++ objectives)...
您正在使用 C 编译器 link 对象。
这对 C++ 或它使用的库一无所知。
g++ cclient.o allocator.o ...(all other c++ objectives)...
这应该有效,因为它不仅 link 是对象,而且还包括 C++ 标准库(包括新建和删除)。
我正在用 C++ 编写一个 "library",它应该也被 C 代码使用。我遵循了这样的过程:
- 使用 g++ 和 gcc 编译器(因为它们是兼容的)。
- 在 C 代码使用的函数中使用 extern "C"
。
- 我的顶层使用了一个带有签名的包装函数,可以被 C 编译器理解。
- 将 C++ 代码(使用 g++)编译为 objective 文件。
- 使用 gcc 编译了我的客户端代码文件。
- 编辑:Tried/want 到 link 使用 gcc(或 ld)(而不是 g++)。
MCV 示例 如下:
mymalloc.h
#include <stdlib.h> /* for size_t */
#ifdef __cplusplus
extern "C"
#endif
void *mymalloc(size_t cbytes);
#ifdef __cplusplus
extern "C"
#endif
void myfree(void *ptr);
allocator.cpp
#include "allocator.h"
#include "mymalloc.h"
Allocator * Allocator::instance = 0;
extern "C" void *mymalloc(size_t cbytes){
Allocator *allocator = Allocator::getInstance();
return allocator->allocateFor(cbytes);
}
extern "C" void myfree(void *ptr){
Allocator *allocator = Allocator::getInstance();
allocator->freePtr(ptr);
}
...
该源文件定义了 C 代码要使用的函数,以及 allocator.h
的方法,它本身包含其他 C++ 内容。
我的 C 客户端文件(cclient.c)是:
#include <stdio.h>
#include "mymalloc.h"
int main(void){
void *p = mymalloc(500);
printf("%p\n", p);
return 0;
}
我的印象是,因为我在顶层有那些包装函数,而且它们的声明可以通过 C 代码查看,所以一切都应该没问题,但我收到 linking 错误:([=显示 59=])
./libmymalloc.a(allocator.o): In function `Allocator::getInstance()':
allocator.cpp:(.text+0x3cf): undefined reference to `operator new(unsigned long)'
allocator.cpp:(.text+0x3fa): undefined reference to `operator delete(void*, unsigned long)'
./libmymalloc.a(allocator.o):(.data.DW.ref.__gxx_personality_v0[DW.ref.__gxx_personality_v0]+0x0): undefined reference to `__gxx_personality_v0'
为了清楚起见,我编译和 linking 的方式是
g++ -c allocator.cpp
... (same for the rest .cpp files)
gcc -c cclient.c
gcc cclient.o allocator.o ...(all other c++ objectives)...
Edit(前三个答案之后):我知道我可以 link 使用 g++。我会对如何使用 C 编译器 link 感兴趣,这样只有 gcc 和 objectives(或其中的库)可用的人可以自己 link。
(这个问题可能是重复的,但我已经阅读了 SO 中的所有其他问题,我无法推断出我做错了什么。)
这看起来像分配器 Allocator
使用 new 和 delete,并且 link 不包含 C++ 库来满足缺少的功能。
您没有 post 您的命令行,但我认为那些命令行中缺少 -lstdc++(由 g++ 自动调用)。
您的问题在这里:
gcc cclient.o allocator.o ...(all other c++ objectives)...
您正在使用 C 编译器 link 对象。
这对 C++ 或它使用的库一无所知。
g++ cclient.o allocator.o ...(all other c++ objectives)...
这应该有效,因为它不仅 link 是对象,而且还包括 C++ 标准库(包括新建和删除)。