我的目标是创建一个用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
所以我不知道问题所在。
答案 0 :(得分:1)
问题不在于C ++或您的共享库或类似的东西。
下次将问题缩小为一个简单的例子。
在这里,您只需将链接标志放在错误的位置:
gcc -lcompareImage c_call_cpp.c -o callCpp.o
# ^^^^^^^^^^^^^^
在使用其符号的对象之后需要
。gcc c_call_cpp.c -o callCpp.o -lcompareImage
the documentation for -l
中明确说明了这一点:
在您编写此选项的命令中,它会有所不同;链接器按照指定的顺序搜索和处理库和目标文件。因此,“
foo.o -lz bar.o
”会在文件z
之后但foo.o
之前搜索库“bar.o
”。如果bar.o
引用“z
”中的函数,则可能无法加载这些函数。