将C++ exe与C库(GNU)连接起来的麻烦
问题描述:
我创建了一些简单的基本代码来说明我的问题。将C++ exe与C库(GNU)连接起来的麻烦
header.h:
#ifdef __cplusplus
# define API extern "C"
#else
# define API
#endif
void callback();
API void libFunction();
testlib.c:
#include "header.h"
void libFunction()
{
Callback();
}
我编译这是像这样一个静态库:
gcc -c testlib.c
ar rsc libtest.a testlib.o
然后我的样本C++代码是
main.cpp:
extern "C"{
#include <lib/header.h>
}
#include <stdio.h>
main()
{
libFunction();
}
void Callback()
{
printf("Callback is called \n");
}
,我尝试建立我的exe文件,以便
g++ -I. -L. main.cpp -ltest
,并出现以下错误
./lib/libtest.a(testlib.o): In function `libFunction':
testlib.c:(.text+0x7): undefined reference to `Callback'
collect2: ld returned 1 exit status
我花了字面上整天试图找出原因。任何人都可以帮忙吗?
答
如果您想从C文件中调用Callback
,则需要在您的C++文件中创建extern "C"
- 否则C++名称修改将导致符号不对齐。您需要更改的Callback()
的定义main.cpp
是:
extern "C" void Callback()
你有一个不匹配的情况下也。您的标题中的原型为callback
,但在其他地方使用Callback
。在重新阅读你的代码时,我认为只要解决这个案例的不匹配问题就可以解决你的所有问题。一读时我没有看到围绕#include <lib/header.h>
的extern "C"
包装。
嗨,你是正确的案件不匹配,这是我发布的代码唯一的问题。我修正了它,现在正在编译,即使没有extern。 – 2013-02-12 21:00:04
现在我只需要找出为什么我的大“真正”的代码不链接大声笑,谢谢你的答复 – 2013-02-12 21:00:30
@BrandonYates - 是的,这是有道理的。我没有注意到'main.cpp'文件中''include'语句的'extern'C''包装器。你应该确定只是修理案件。 – 2013-02-12 21:00:53