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

标签 c++ linux opencv shared-libraries

我正在尝试在 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: 无法执行二进制文件: Exec 格式错误

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

最佳答案

经过更多的思考,我在上述问题中发现了几个愚蠢的错误

这是为可能陷入类似问题的其他人提供的更正流程

  1. 首先编译

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

  2. 通过使用 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

  3. 将 soname 与图书馆联系起来

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

  4. 编译并创建测试文件对象

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

  5. 复制共享库文件到本地库

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

  6. 确保 $LD_LIBRARY_PATH 指向共享库路径

    导出 LD_LIBRARY_PATH=/usr/local/lib

  7. 运行

    ./cprog

关于c++ - 创建在linux中使用opencv的C++动态库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38393466/

相关文章:

Linux系统时区更改后Linux上的Mysql时区更改

linux - config.log 在哪里 Ubuntu 14.04 LTS (gnu/Linux 3.13.0-30-generic *86_64)

c++ - OpenCV VideoWriter 打不开

C++ amp 原子

c++ - 没有已知的从 std::ostream* 到 std::ostream& 的转换

c++ - 为什么链接为 *.a 静态库时 "WinMain"未解析?

java - 为什么 Java 不能通过蓝牙耳机播放声音?

c++ - opencv中的 mask

python - (-215:Assertion failed) !_src.empty() in function 'cv::cvtColor' with cv::imread

c++ - 如何转换std::filesystem::file_time_type to time_t?