我目前正在尝试将大型 C++ 程序链接到 C“包装器”,以允许与编译器理解 C 但不理解 C++(准确地说是 Haskell GHC)的另一种语言的程序集成。但我尝试这样做,无论是使用 GHC 还是 GCC,都会遇到奇怪的问题。
为了简明扼要地模拟这种情况,假设我在 C 中有一个主程序文件:
cmain.c
#include "header.h"
#include <stdio.h>
int main () {
printf("%d\n", cppfun(12));
return 0;
}
以及在 .cpp 文件中定义的辅助函数:
cpp模块.cpp
#include "header.h"
#include "further.h"
class foobar {
public:
int getfive () {return 5;}
};
extern "C" {
int cppfun(int foo) {
foobar fb;
return fb.getfive();
}
}
这么多编译就好了。但是,如果 cppmodule.cpp 引用另一个 .cpp 文件,如下所示:
cppmodule.cpp mk II
#include "header.h"
#include "further.h"
class foobar {
public:
int getfive () {return 5;}
};
extern "C" {
int cppfun(int foo) {
foobar fb;
return fb.getfive() + morecpp();
}
}
新的 .cpp 文件与此类似;
morecpp.cpp
#include "further.h"
class moreobjects {
public:
int getsix() {return 6;}
};
#ifdef __cplusplus
extern "C" {
#endif
int morecpp() {
moreobjects mo;
return mo.getsix();
}
#ifdef __cplusplus
}
#endif
当我尝试使用“gcc cmain.o cppmodule.o morecpp.o”之类的命令进行编译时,突然出现错误;使用 g++ 编译是可行的,但正如我所提到的,这种解决方案不符合我的目的。
我试图编译这个例子的错误是
max@SoutheastCorner:~/Projectsync/maketest$ gcc cmain.o cppmodule.o morecpp.o
cppmodule.o:(.eh_frame+0x4b): undefined reference to `__gxx_personality_v0'
collect2: error: ld returned 1 exit status
与我的实际项目代码进行相同类型的尝试还给出了表单错误的屏幕截图
hopnode.cpp:(.text._ZN9__gnu_cxx13new_allocatorISt10_List_nodeI4nodeIPcS3_EEE8allocateEmPKv[_ZN9__gnu_cxx13new_allocatorISt10_List_nodeI4nodeIPcS3_EEE8allocateEmPKv]+0x4d): undefined reference to `operator new(unsigned long)'
/tmp/ccaoEEFM.o: In function `__gnu_cxx::new_allocator<std::_Rb_tree_node<std::pair<char* const, node<char*, char*> > > >::allocate(unsigned long, void const*)':
hopnode.cpp:(.text._ZN9__gnu_cxx13new_allocatorISt13_Rb_tree_nodeISt4pairIKPc4nodeIS3_S3_EEEE8allocateEmPKv[_ZN9__gnu_cxx13new_allocatorISt13_Rb_tree_nodeISt4pairIKPc4nodeIS3_S3_EEEE8allocateEmPKv]+0x2c): undefined reference to `std::__throw_bad_alloc()'
hopnode.cpp:(.text._ZN9__gnu_cxx13new_allocatorISt13_Rb_tree_nodeISt4pairIKPc4nodeIS3_S3_EEEE8allocateEmPKv[_ZN9__gnu_cxx13new_allocatorISt13_Rb_tree_nodeISt4pairIKPc4nodeIS3_S3_EEEE8allocateEmPKv]+0x46): undefined reference to `operator new(unsigned long)'
任何见解将不胜感激。