从 C 代码链接错误调用C++函数(使用 gcc 进行链接)
Calling C++ function from C code linkage errors (using gcc for linking)
我正在用C++编写一个"库",它应该也被C代码使用。我遵循了这样的过程: - 使用 g++ 和 gcc 编译器
(因为它们是兼容的)。 -extern "C"
用于 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 代码要使用的函数,以及本身包括其他C++内容的allocator.h
方法。
我的 C 客户端文件 (cclient.c) 是:
#include <stdio.h>
#include "mymalloc.h"
int main(void){
void *p = mymalloc(500);
printf("%pn", 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++ 自动调用)中缺少
。这看起来像分配器Allocator
使用new和delete,并且链接不包括C++库来满足缺少的功能。
你的问题在这里:
gcc cclient.o allocator.o ...(all other c++ objectives)...
您正在使用 C 编译器来链接对象。
它对C++或它使用的库一无所知。
g++ cclient.o allocator.o ...(all other c++ objectives)...
这应该有效,因为它不仅链接对象,还包括C++标准库(包括新建库和删除库)。
相关文章:
- 使用gcc从静态链接的文件中查找可选符号
- 有了gcc,是否可以链接库,但前提是它存在
- 未知的 GCC 链接器错误,但已成功构建
- 程序使用boost::文件系统链接clang,但不使用gcc
- 链接时 GCC 内存过载
- 微控制器的首次 gcc 链接器脚本编译但不运行
- 使用 gcc 6 构建 OpenJDK8 时出现链接错误
- 使用 GCC 的静态和动态链接
- gcc (g++) 如何链接多个库?
- 在这种情况下,GCC 和 clang 是否显示与 Visual Studio 相同的结果,关于语言链接?
- 与NVIDIA链接的错误GCC版本
- 链接库时的默认目录上的GCC或G 路径搜索顺序
- C++ MinGW GCC CodeBlocks静态链接
- GTEST链接错误(从GCC 4.X移动到GCC 7.x)
- 链接 gcc 6、gcc 7 和 gcc 8 对象是否安全?
- 如何动态链接 GCC 对象
- Sun Studio 链接 gcc 库:例外不起作用
- 仅针对直接依赖关系链接GCC/LD
- 如何链接GCC中的libc和libstdc++的调试版本
- 链接GCC中的库