c++ - 创建依赖于其他共享对象的共享对象

标签 c++ linux opencv gcc shared-libraries

问题

我正在创建一个使用 OpenCV 共享对象(例如 libopencv_core.so)的共享对象(称为 libA.so)。

这是我共享对象的代码:

#include "opencv2/opencv.hpp"
#include "rgbframe.h"

#define API_EXPORT  __attribute__ ((visibility ("default")))
#define API_LOCAL  __attribute__ ((visibility ("hidden")))

using namespace cv;

API_EXPORT RGBFrame getFrame(int width, int height){
    VideoCapture cap(0);
    RGBFrame frame;
    
    if(!cap.isOpened())
        return frame;

    // Set camera resolution
    cap.set(CV_CAP_PROP_FRAME_WIDTH, width);
    cap.set(CV_CAP_PROP_FRAME_HEIGHT, height);
    
    frame.rows = height;
    frame.cols = width;
    frame.data = new uchar[frame.rows * frame.cols * 3];
    Mat mat(frame.rows, frame.cols, CV_8UC3, frame.data);
    
    // Get a frame
    cap >> mat;
    
    // Convert BGR to RGB
    cv::cvtColor(mat, mat, CV_BGR2RGB, 3);
    
    return frame;
}

下面是我如何编译它:

gcc -shared -fPIC -Wl,-soname,libA.so -std=c++11 -lpthread -lopencv_core -lopencv_video -lopencv_highgui -lopencv_imgproc -o libA.so test.cpp

因此从上面的行中,我们知道libA.so依赖于opencv_coreopencv_video等。

它可以很好地编译和链接,但是当我ldd libA.so 时,它会打印:

linux-vdso.so.1 =>  (0x00007ffc71b76000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f074cbaa000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f074c7e3000)
/lib64/ld-linux-x86-64.so.2 (0x000055b29e8bd000)

意味着我的库不依赖于 OpenCV .so 文件。除此之外,当我在一个简单的程序中使用我的库时,整个程序都无法编译。我在 libA.so 中使用的 OpenCV 函数将有一堆 undefined reference

问题

我应该如何构建我的 libA.so 以使其依赖于 OpenCV 库?当我在其他程序中使用它时,它会被编译和链接。

最佳答案

这可能是 how-to-know-if-one-shared-library-depends-on-another-shared-library-or-not 的复制品

TLDR 是您应该将链接库放在对象/源文件之后。

关于c++ - 创建依赖于其他共享对象的共享对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40780247/

相关文章:

c++ - 如何在 C++ 中将 vector 迭代器转换为 int

opencv - 检测图像的模糊程度

linux - 如何设置提交后运行 "xterm -e unison &"的提交后 Hook ?

linux - 自动化 : finding non-used servers from a list of servers

c# - .NET Core System.Drawing.Common PrintDocument 在 Linux 上不起作用

opencv - 使用OpenCV检测不同的 body 部位

c# - 如何获取数组中处于一定范围内的数字数量?

C++ 用户输入字符串错误

c++ - 空流,我必须包括 ostream 吗?

c++ - 如何将文件从一个文件夹复制到另一个文件夹