У меня есть код, который отлично работает, но если я свяжу свой проект со сторонней библиотекой 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)
Это хорошо компилируется, но segfault при запуске. Если я удалю строку
Abc dummyAbc;
тогда все работает нормально (т.е. нет проблем с отсутствующим файлом или opencv).
Если я проверю стек segfault, я увижу, что:
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
на самом деле экспортируют весь API libpng (с которым, я полагаю, он был статически связан?). Я предполагаю, что это проблема? Я не хочу, чтобы openCV видел все, что экспортирует libabc.so
... Как я могу это сделать?
Пробовал использовать objcopy --prefix-symbols abc_ libabc.so
но как-то не помогло, теперь вылет происходит на abc_png_destroy_write_struct
.