【发布时间】:2017-04-04 18:45:04
【问题描述】:
我的目标是创建一个从 c++ 创建的共享库。我想从 C 程序调用该库中的函数
我有一个 compareImage.h:
#ifdef __cplusplus
#define EXTERNC extern "C"
#else
#define EXTERNC
#endif
EXTERNC int compareTwoImages();
#undef EXTERNC
还有一个 compareImage.cpp 文件:
#include "SURF_Homography.h"
extern "C" int compareTwoImages(){
..
}
我已经使用这个命令创建了一个共享库:
g++ -ggdb `pkg-config --cflags opencv` -fpic -shared compareImage.cpp -o libcompareImage.so `pkg-config --libs opencv`
然后,我编写一个 c 程序从共享库中调用 compareTwoImages() 函数,如下所示:
#include <stdio.h>
int main() {
/* my first program in C */
int test = compareTwoImages();
printf("Comparison Results: %d\n", test);
return 0;
}
并用这个命令编译它:
gcc -lcompareImage c_call_cpp.c -o callCpp.o
但它显示错误:
/tmp/cc0wuZTU.o: In function `main':
c_call_cpp.c:(.text+0xe): undefined reference to `compareTwoImages'
collect2: error: ld returned 1 exit status
所以我不知道问题是什么。
【问题讨论】:
-
问题是您没有将程序与共享库链接。仅仅因为您的硬盘驱动器上的某个文件,以及您的代码使用的功能,并不意味着编译器会自动知道它在哪里。您必须显式链接到该共享库(并确保它在运行时位于共享库搜索路径中)。有关
-l选项,请参阅ld(1)的文档,您可以通过gcc 传递。 -
首先,库 -lcompareImage 应该在 c_call_cpp.c 之后。
-
感谢 Sam 和 Anon。我的错误是把 -lcompareImage 放在 c_call_cpp.c 之前,它现在可以工作了。
-
@AnonMail:答案部分的答案
标签: c++ c shared-libraries