【问题标题】:How to make CMake or OpenCV link statically [cross compilation Linux -> Windows]如何静态制作 CMake 或 OpenCV 链接 [交叉编译 Linux -> Windows]
【发布时间】:2020-04-06 15:01:19
【问题描述】:

我想静态构建一个,因为我需要在多个平台(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 中,但在内部使用“-static”标志

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 配置

我已经为此花费了几个小时,因此非常感谢您的帮助。

【问题讨论】:

  • 您可以使用conan 来管理依赖项。在那里你可以配置下载和使用静态库
  • @ThomasSablik 我试过柯南,结果证明它是一个很棒的工具。但是我现在得到其他错误。这将很快与这个问题无关。

标签: c++ opencv cmake linker static-linking


【解决方案1】:

这应该强制静态链接 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++")

【讨论】:

  • 我得到:CMake Error at CMakeLists.txt:7 (set_target_properties): set_target_properties Can not find target to add properties to: libpng 它指的是你的 sn-p 的第一行。
猜你喜欢
  • 1970-01-01
  • 2021-01-21
  • 1970-01-01
  • 2021-09-07
  • 1970-01-01
  • 1970-01-01
  • 2021-05-03
  • 1970-01-01
  • 2015-06-14
相关资源
最近更新 更多