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

时间:2017-10-24 21:17:18

标签: 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);

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

./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和目标(或者那些库)的人可以自己链接。

(这个问题可能是重复的,但我已经阅读了所有其他问题而且我无法扣除我做错了什么。)

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:2)

这看起来像分配器Allocator使用new和delete,并且该链接不包含C ++库以满足缺少的函数。

答案 2 :(得分:2)

你的问题在这里:

gcc cclient.o allocator.o ...(all other c++ objectives)...

您正在使用C编译器链接对象 这对C ++或它使用的库一无所知。

g++ cclient.o allocator.o ...(all other c++ objectives)...

这应该有效,因为它不仅链接对象,还包括C ++标准库(包括new和delete)。