代码之家  ›  专栏  ›  技术社区  ›  kyriakosSt

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

  •  0
  • kyriakosSt  · 技术社区  · 7 年前

    我正在用C++编写一个“库”,它应该也被C代码使用。我遵循了以下流程:
    -使用g++和gcc编译器(因为它们是兼容的)。
    -已使用 extern "C"
    -我的顶层使用了一个具有签名的包装函数,该签名可以被C编译器理解。
    -编译成目标文件的C++代码(使用g++)。
    -用gcc编译了我的客户端代码文件。
    -编辑: .

    MCV示例 如下所示:

    #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);
    

    分配器。清洁石油产品

    #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客户端文件( )是:

    #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中的所有其他问题,我无法推断我做错了什么。)

    3 回复  |  直到 7 年前
        1
  •  3
  •   Öö Tiib    7 年前

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

        2
  •  2
  •   mksteve    7 年前

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

        3
  •  2
  •   Loki Astari    7 年前

    你的问题是:

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


    这对C++或它使用的库一无所知。

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

    这应该是可行的,因为它不仅链接了对象,还包括C++标准库(包括new和delete)。