创建依赖于其他共享对象的共享对象
Creating a shared object which depends on other shared objects
问题
我正在创建一个使用 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_core
, opencv_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
.
中使用了一堆 undefined reference
到 OpenCV 函数
问题
我应该如何构建我的 libA.so
以使其依赖于 OpenCV 库?当我在其他程序中使用它时,它会被编译和链接。
这可能是
的复制品
TLDR 是您应该将链接库放在 object/source 个文件之后。
问题
我正在创建一个使用 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_core
, opencv_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
.
undefined reference
到 OpenCV 函数
问题
我应该如何构建我的 libA.so
以使其依赖于 OpenCV 库?当我在其他程序中使用它时,它会被编译和链接。
这可能是
TLDR 是您应该将链接库放在 object/source 个文件之后。