如何编译与libstdc ++静态链接的OpenCV

时间:2013-03-02 02:49:14

标签: opencv mingw

我需要编译与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()

1 个答案:

答案 0 :(得分:1)

首先确保您不会依赖链接共享系统库的库。例如,您可以使用标记BUILD_ZLIBBUILD_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链接器标志以进行静态链接。