【发布时间】: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