在linux中创建使用opencv的C++动态库

Posted

技术标签:

【中文标题】在linux中创建使用opencv的C++动态库【英文标题】:creating C++ dynamic library which uses opencv in linux 【发布时间】:2016-07-15 10:10:46 【问题描述】:

我正在尝试在 linux 中为一个使用 opencv 和 tesseract 以及动态链接的程序创建一个共享库

我关注了link 我的代码如下

g++ -c Serial_Key.cpp -fPIC -o cdserial `pkg-config --cflags --libs opencv` -llept -ltesseract
g++ -shared -Wl,-soname,libctest.so.1 -o libctest.so.1.0 cdserial
ln -sf libctest.so.1.0 libctest.so
ln -sf libctest.so.1.0 libctest.so.1
g++ -c Test.cpp -fPIC -o cprog -lctest `pkg-config --cflags --libs opencv` -llept -ltesseract

这里Test.cpp是一个简单的文件如下

#include <stdio.h>
int Serial_key();
int main()
int x=Serial_key();
printf("Success");
return 0;

不知何故,它给 ./cprog 的错误是 ./cprog: 无法执行二进制文件:执行格式错误

我觉得我在第 2 行犯了一些根本性错误(g++ -shared) 请指导

【问题讨论】:

【参考方案1】:

经过一番摸索后,我在上面提到的问题中发现了几个愚蠢的错误

对于可能陷入类似问题的其他人来说,这是正确的流程

    首先编译

    g++ -c Serial_Key.cpp -fPIC -o cdserial

    通过使用 soname 提及库及其路径来创建共享库

    g++ -shared -Wl,-soname,libctest.so.1 -o libctest.so.1.0 cdserial -lopencv_highgui -lopencv_imgproc -lopencv_core -lopencv_imgcodecs -lopencv_videoio -llept -ltesseract -L/usr/local/lib

    将 soname 与库链接

    ln -sf libctest.so.1.0 libctest.so ln -sf libctest.so.1.0 libctest.so.1

    为测试文件编译和创建对象

    g++ Test.cpp -fPIC -o cprog -lctest -lopencv_highgui -lopencv_imgproc -lopencv_core -lopencv_imgcodecs -lopencv_videoio -llept -ltesseract -L/usr/local/lib

    将共享库文件复制到本地库

    cp libctest.so /usr/local/lib cp libctest.so.1 /usr/local/lib cp libctest.so.1.0 /usr/local/lib

    确保 $LD_LIBRARY_PATH 指向共享库路径

    导出 LD_LIBRARY_PATH=/usr/local/lib

    运行

    ./cprog

【讨论】:

以上是关于在linux中创建使用opencv的C++动态库的主要内容,如果未能解决你的问题,请参考以下文章

在 Java 客户端中创建 Mat 对象,使用 opencv 从 C++ 服务器发送

在 C++ 中创建动态对象的动态数组

在 C++ 中创建动态类型

如何在C++中创建一维动态数组

使用 C++ 在 Visual Studio 中创建虚拟绘图板 [关闭]

在 C++ 中的类中创建类对象的动态数组