将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"包装。

+0

嗨,你是正确的案件不匹配,这是我发布的代码唯一的问题。我修正了它,现在正在编译,即使没有extern。 – 2013-02-12 21:00:04

+0

现在我只需要找出为什么我的大“真正”的代码不链接大声笑,谢谢你的答复 – 2013-02-12 21:00:30

+0

@BrandonYates - 是的,这是有道理的。我没有注意到'main.cpp'文件中''include'语句的'extern'C''包装器。你应该确定只是修理案件。 – 2013-02-12 21:00:53