我需要编译与libstdc ++静态链接的OpenCV,以避免Qt5和OpenCV所需的不同DLL版本的libstdc ++ - 6.dll的问题。按照本文的步骤:http://www.argong.com/docs/how-to-OpenCV-2.2.0.pdf并将下面的行添加到CMakeLists.txt我希望得到与libstdc ++静态链接的OpenCV DLL,但OpenCV继续依赖于libstdc ++ - 6.dll。我将使用libstdc ++静态链接的OpenCV库做错了吗?
if (MINGW)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -static-libgcc")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -static-libgcc -static-libstdc++")
set(CMAKE_SHARED_LIBRARY_LINK_C_FLAGS "${CMAKE_SHARED_LIBRARY_LINK_C_FLAGS} -static-libgcc -s")
set(CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS "${CMAKE_SHARED_LIBRARY_LINK_CXX_FLAGS} -static-libgcc -static-libstdc++ -s")
endif()
答案 0 :(得分:1)
首先确保您不会依赖链接共享系统库的库。例如,您可以使用标记BUILD_ZLIB
,BUILD_JPEG
等来编译捆绑的源组件(如zlib,jpeg等)。您还可以禁用对Vtk(WITH_VTK
等可选组件的依赖性。 flag)和其他可能已作为共享库存在于系统中的文件。然后,如果要将OpenCV构建为共享库,请使用cmake -C
命令在缓存中推送共享链接器标志变量(CMAKE_SHARED_LINKER_FLAGS
)上的设置:
set(CMAKE_SHARED_LINKER_FLAGS "-static -static-libgcc -static-libstdc++" CACHE INTERNAL "" FORCE)
或者,如果您使用-DBUILD_SHARED_LIBS=FALSE
静态编译OpenCV,则可以在最终共享对象或可执行文件上插入gcc链接器标志以进行静态链接。