关于Linux .so文件无法链接到main.cpp文件

时间:2016-12-29 22:44:07

标签: c++ c linux shared-libraries

我想创建一个.so文件,让main.cpp文件可以从.so文件中调用函数。

这些是我的档案。

//aa.h
#include <stdio.h>
#include <stdlib.h>
void hello();

//hola.c
#include <stdio.h>
#include "aa.h"
void hello()
{printf("Hello world!\n");}

//main.cpp
#include "aa.h"
void hello();
int main(){hello();return 0;}

这是以下步骤。

第1步:创建.so文件

$ gcc hola.c  -fPIC -shared -o libhola.so

它有效

步骤2:将libhola.so链接到main.cpp并创建名为test

的执行文件
$ gcc main.cpp -L. -lhola -o test

我试过的只是两步。

错误说:

main.cpp:(.text+0x12): undefined reference to `hello()'
collect2: error: ld returned 1 exit status

我曾经尝试将libhola.so移动到/ usr / lib并将aa.h移动到/ usr / included,但不能正常工作。

1 个答案:

答案 0 :(得分:2)

您正在将共享库编译为C文件(特别是hello()函数),但您在编译C ++源代码时将其链接。您需要确保可以从C ++可执行文件中调用hello()(即不是name mangled)。

即。在标题extern "C"中添加aa.h

#ifdef __cplusplus
 extern "C" {
#endif
void hello();

#ifdef __cplusplus
}
#endif

我建议添加include guard

或者,如果您将main.cpp重命名为main.c,那么在没有此条件的情况下进行正常编译。