【问题标题】:Call a function in shared .so from C从 C 调用 shared .so 中的函数
【发布时间】: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


【解决方案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”在文件foo.o 之后但在bar.o 之前搜索库“z”。如果bar.o 引用了‘z’中的函数,这些函数可能不会被加载。

【讨论】:

    猜你喜欢
    • 2020-05-07
    • 2015-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多