创建一个取决于其他共享对象的共享对象

Creating a shared object which depends on other shared objects

本文关键字:共享 对象 其他 取决于 一个 创建      更新时间:2023-10-16

问题

我正在创建一个共享对象(称为libA.so),该对象使用OPENCV共享对象(例如libopencv_core.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库?当我在其他程序中使用它时,它将被编译和链接。

这可能是一个dup的dup,dup是一对一折 - 与靠近的靠背依赖的属于单位共享的折扣

tldr是您应该在对象/源文件之后放置链接的libs。