从C调用共享.so中的函数

时间:2017-04-04 18:45:04

标签: c++ c shared-libraries

我的目标是创建一个用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

所以我不知道问题所在。

1 个答案:

答案 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”中的函数,则可能无法加载这些函数。