c++ - 从 C 代码链接错误调用 C++ 函数(使用 gcc 进行链接)

标签 c++ c gcc linker-errors

我正在用 C++ 编写一个“库”,它应该也被 C 代码使用。我遵循了这样的过程:
- 使用 g++ 和 gcc 编译器(因为它们是兼容的)。
- 在 C 代码要使用的函数中使用 extern "C"
- 我的顶层使用了一个带有签名的包装函数,可以被 C 编译器理解。
- 将 C++ 代码(使用 g++)编译为目标文件。
- 用 gcc 编译了我的客户端代码文件。
- 编辑:尝试/想要将它们与 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);

分配器.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 代码查看,所以一切都应该没问题,但我遇到了链接错误:(示例/示例显示)

./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'

为了清晰起见,我编译和链接的方式是

g++ -c allocator.cpp
... (same for the rest .cpp files)
gcc -c cclient.c
gcc cclient.o allocator.o ...(all other c++ objectives)...

编辑(在前三个答案之后):我知道我可以使用 g++ 进行链接。我会对如何与 C 编译器链接感兴趣,以便只有 gcc 和目标(或来自这些目标的库)可用的人可以自己链接。

(这个问题可能是重复的,但我已经阅读了 SO 中的所有其他问题,我无法推断出我做错了什么。)

最佳答案

您没有发布命令行,但我认为其中缺少 -lstdc++(由 g++ 自动调用)。

关于c++ - 从 C 代码链接错误调用 C++ 函数(使用 gcc 进行链接),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46920150/

相关文章:

c++ - 需要一些帮助将我的结果写入文件

c - 为什么这些词不附加在 C 中?

c - 为什么 sscanf %n 格式说明符对返回值没有影响?

c - 存储对变量数组所做的更改

c++ - 如何避免这句话在模板 SFINAE 中是错误的?

c++如何处理循环依赖?

c - __asm__ __volatile__ 在 C 中做什么?

编译包含包含 C 定义的头文件的汇编代码

c++ - decltype 和成员函数(非指针)类型

c - free 对按值传递给函数的指针有什么作用?