我正在将用 C 编写的中型(10,000 行左右)程序集成到 C++ 程序中。我创建了一个新类,BWAGenome
作为 C 代码的接口,因此对 C 函数的任何访问都被封装。我正在用g++
编译器编译所有东西。.o 文件都是正确生成的,但是当我尝试将它们链接到最终的可执行文件中时,编译器会抱怨它找不到符号。这是我收到的错误消息:
Undefined symbols:
BWAGenome::BWTRestoreBWT(char const*)", referenced from:
BWAGenome::BWAGenome(char const*)in BWAGenome.o
"BWAGenome::GetMatches(unsigned int, int, bwt_t*, bwt_t*, bwt_t*, bntseq_t*, bntseq_t*)", referenced from:
BWAGenome::getMatches(unsigned int, int)in BWAGenome.o
这些函数都在我制作的C++类中。它们将函数包装在 C 代码中,但我完全不明白符号是如何未定义的。
关于代码的一些细节以及我到目前为止所做的事情:
- 一切都是用 编译的
g++
,所以如果我理解正确,我不需要extern "C" {};
包含我包含的 c 头文件。 - 所有代码都可以单独正确编译。该错误仅在链接期间发生。
- 我在某处听说可能需要从静态函数调用 C 代码,所以我尝试将每个对 C 函数的调用包装在静态类方法中并调用它。
关于如何解决这个问题的任何想法?
编辑:添加了 BWTRestoreBWT 和 GetMatches 的定义和声明
//definition in BWAGenome.h
static bwt_t * BWTRestoreBWT(const char *fn);
//declaration in BWAGenome.cpp
static bwt_t * BWTRestoreBWT(const char *fn) {
return bwt_restore_bwt(fn);
//bwt_restore_bwt is a function in the C code that I am attempting to integrate
}
第二次编辑:经过深思熟虑后,我意识到这个问题与我认为的大部分问题无关。有关详细信息,请参阅我的答案。