尝试使用 extern "C" 在 C 中调用 C++ 方法,得到 "undefined reference to" 对象的链接器错误
Trying to call C++ method in C using extern "C", get a linker error of "undefined reference to" object
我尝试做的是从 C 文件中调用一个 C++ 方法,在一个新的但相当大的代码库中。我从代码库的其他地方抄袭了一个实现,但是当我尝试构建它时遇到链接器错误。
我认为我正在做的是在 .cpp/.h 文件对中制作 class。在全局头文件中,我声明了一个包装函数,在 .cpp 文件中,我在 extern "C" 中定义了该包装函数,并让它调用 class' 方法。然后我从我的主 .c 文件中调用包装函数。
我实际上做的是错误的。在过去的几个小时里,我一直在阅读类似的 Whosebug 错误以及 extern "C" 的工作原理,但我仍然不明白哪里出了问题。我在这里做的事情有明显的错误吗?
我对我对这个项目的构建系统是如何设置的理解没有信心,但我通常相信它设置正确,并且我已经将 myclass.cpp 添加到正确的列表中构建目标。所以我想错误可能在下面的某个地方。
错误信息:
Creating objlist.lnk...
Linking into output.elf
module.o: In function `MyClass::MyMethod()':
~/myclass.cpp:5: undefined reference to `MyClass::stat_MyClass'
~/myclass.cpp:5: undefined reference to `MyClass::stat_MyClass'
module.o:~/myclass.cpp:5: more undefined references to `MyClass::stat_MyClass' follow
collect2: error: ld returned 1 exit status
make[1]: *** [output.elf] Error 1
make: *** [default] Error 2
转述代码:
global.h
#ifdef __cplusplus
extern "C" {
#endif
int my_c_wrapper_func(void);
// other function declarations
#ifdef __cplusplus
}
#endif
global.c
#include "global.h"
// my_c_wrapper_func() not defined here
// other function definitions
myclass.h
#include "global.h"
class MyClass {
public:
static MyClass* get() { return &stat_MyClass; } // Get the singleton
int MyMethod();
private:
static MyClass stat_MyClass; // The singleton
}
myclass.cpp
#include "myclass.h"
extern "C" int my_c_wrapper_func() {
return MyClass::get()->MyMethod();
}
int MyClass::MyMethod() {
return 1;
}
main.c
#include "global.h"
int main() {
return(my_c_wrapper_func());
}
@HolyBlackCat 说的对,我的错误是忘记定义stat_MyClass。将以下行添加到 myclass.cpp 的顶部修复了所有问题。
MyClass MyClass::stat_MyClass;
当我只是编译独立文件时,错误没有出现,所以我没有考虑在我添加外部代码之前将我的精力集中在已经存在(或不存在)的东西上。谢谢!
我尝试做的是从 C 文件中调用一个 C++ 方法,在一个新的但相当大的代码库中。我从代码库的其他地方抄袭了一个实现,但是当我尝试构建它时遇到链接器错误。
我认为我正在做的是在 .cpp/.h 文件对中制作 class。在全局头文件中,我声明了一个包装函数,在 .cpp 文件中,我在 extern "C" 中定义了该包装函数,并让它调用 class' 方法。然后我从我的主 .c 文件中调用包装函数。
我实际上做的是错误的。在过去的几个小时里,我一直在阅读类似的 Whosebug 错误以及 extern "C" 的工作原理,但我仍然不明白哪里出了问题。我在这里做的事情有明显的错误吗?
我对我对这个项目的构建系统是如何设置的理解没有信心,但我通常相信它设置正确,并且我已经将 myclass.cpp 添加到正确的列表中构建目标。所以我想错误可能在下面的某个地方。
错误信息:
Creating objlist.lnk...
Linking into output.elf
module.o: In function `MyClass::MyMethod()':
~/myclass.cpp:5: undefined reference to `MyClass::stat_MyClass'
~/myclass.cpp:5: undefined reference to `MyClass::stat_MyClass'
module.o:~/myclass.cpp:5: more undefined references to `MyClass::stat_MyClass' follow
collect2: error: ld returned 1 exit status
make[1]: *** [output.elf] Error 1
make: *** [default] Error 2
转述代码:
global.h
#ifdef __cplusplus
extern "C" {
#endif
int my_c_wrapper_func(void);
// other function declarations
#ifdef __cplusplus
}
#endif
global.c
#include "global.h"
// my_c_wrapper_func() not defined here
// other function definitions
myclass.h
#include "global.h"
class MyClass {
public:
static MyClass* get() { return &stat_MyClass; } // Get the singleton
int MyMethod();
private:
static MyClass stat_MyClass; // The singleton
}
myclass.cpp
#include "myclass.h"
extern "C" int my_c_wrapper_func() {
return MyClass::get()->MyMethod();
}
int MyClass::MyMethod() {
return 1;
}
main.c
#include "global.h"
int main() {
return(my_c_wrapper_func());
}
@HolyBlackCat 说的对,我的错误是忘记定义stat_MyClass。将以下行添加到 myclass.cpp 的顶部修复了所有问题。
MyClass MyClass::stat_MyClass;
当我只是编译独立文件时,错误没有出现,所以我没有考虑在我添加外部代码之前将我的精力集中在已经存在(或不存在)的东西上。谢谢!