gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 20:21:17 26 4
gpt4 key购买 nike

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

所以我不知道问题出在哪里。

最佳答案

问题不在于 C++ 或共享库或类似的东西。

下次将您的问题缩小到一个简单的示例。

这里您只是将链接标志放在了错误的位置:

gcc -lcompareImage c_call_cpp.c -o callCpp.o
# ^^^^^^^^^^^^^^

它需要位于将使用其符号的对象之后。

gcc c_call_cpp.c -o callCpp.o -lcompareImage

这在 the documentation for -l 中有明确说明:

It makes a difference where in the command you write this option; the linker searches and processes libraries and object files in the order they are specified. Thus, ‘foo.o -lz bar.o’ searches library ‘z’ after file foo.o but before bar.o. If bar.o refers to functions in ‘z’, those functions may not be loaded.

关于c++ - 从 C 调用共享 .so 中的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43215228/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com