Как сделать ссылки CMake или OpenCV статически [кросс-компиляция Linux -> Windows] - PullRequest
0 голосов
/ 06 апреля 2020

Я хочу построить статически, потому что мне нужно распространять приложение на несколько платформ (Linux и Windows). OpenCV был построен и установлен на машине linux статически.

Здесь вы можете увидеть соответствующие части, которые включены в мой CMakeLists.txt, которые должны были сделать ссылку OpenCV статически

#windows
message("Compiling for windows")
set(CMAKE_CXX_COMPILER x86_64-w64-mingw32-g++)
set(BUILD_SHARED_LIBS OFF) #this has no effect
set(CMAKE_LINK_LIBRARY_SUFFIX ".a") #this has no effect

#openCV
set(OpenCV_STATIC ON)  #this has no effect
find_package(OpenCV REQUIRED ) 
include_directories(${OpenCV_INCLUDE_DIRS} )

Во время линковки я получаю эту ошибку, так как она, очевидно, является библиотекой, необходимой для opencv:

/usr/lib/x86_64-linux-gnu/libpng.so: error adding symbols: File in wrong format
collect2: error: ld returned 1 exit status

Как вы можете видеть, используется libpng.so. Хотя в этой папке также доступен файл libpng.a.

Это происходит только с mingw, но использование флага "-stati c" внутри

target_link_libraries( Tracking ${OpenCV_LIBS} "-static")

приводит к

/usr/bin/x86_64-w64-mingw32-ld: attempted static link of dynamic object `/usr/lib/x86_64-linux-gnu/libpng.so'
collect2: error: ld returned 1 exit status

Таким образом, он по-прежнему использует файл .so вместо .a. Поэтому я подозреваю, что мне нужно изменить конфигурацию OpenCV

Я потратил часы на это, поэтому помощь приветствуется.

1 Ответ

0 голосов
/ 06 апреля 2020

Это должно заставить статически связывать libpng:

set_target_properties(libpng PROPERTIES LINK_SEARCH_START_STATIC 1)
set_target_properties(libpng PROPERTIES LINK_SEARCH_END_STATIC 1)

set(CMAKE_FIND_LIBRARY_SUFFIXES ".a")

set(CMAKE_EXE_LINKER_FLAGS "-static-libgcc -static-libstdc++")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...