我想创建一个.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,但不能正常工作。
答案 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
,那么在没有此条件的情况下进行正常编译。