【发布时间】:2019-11-24 20:05:30
【问题描述】:
我的代码可以正常工作,但如果我将我的项目链接到第三方库 libabc.so(源不可用),那么我会突然遇到分段错误。
我有一个看起来像这样的主目录
#include <opencv2/imgcodecs.hpp>
#include "Abc.h"
int main(int argc, char **argv)
{
Abc dummyAbc;
auto img = cv::imread("dummy.png");
cv::imwrite("123.png", img);
return 0;
}
CMakeList.txt如下
cmake_minimum_required(VERSION 3.1)
set(CMAKE_C_STANDARD 11)
find_package(OpenCV COMPONENTS core highgui imgcodecs)
include_directories(${OpenCV_INCLUDE_DIR})
add_executable(my_project Main.cpp)
target_link_libraries(my_project ${OpenCV_LIBRARIES} abc)
这编译得很好,但是运行时会出现段错误。如果我删除该行
Abc dummyAbc;
然后一切正常(即丢失文件或opencv没有问题)。
如果我检查段错误的堆栈,我会看到:
Thread 1 "my_project" received signal SIGSEGV, Segmentation fault.
0x00007fdea96836b3 in png_destroy_write_struct () from /usr/local/lib/libabc.so
png_destroy_write_struct 被cv::imwrite 调用。
libpng.so 和 libabc.so (!!) export png_destroy_write_struct 实际上导出了所有 libpng API(我假设它是静态链接的?)。我假设这是问题所在?我不想让 openCV看到libabc.so 导出的任何东西......我该怎么做?
我尝试使用objcopy --prefix-symbols abc_ libabc.so,但不知何故没有帮助,现在崩溃发生在abc_png_destroy_write_struct。
【问题讨论】:
标签: c++ opencv shared-libraries dynamic-linking dynamic-loading