我需要编译与libstdc++静态链接的OpenCV,以避免Qt5和OpenCV需要libstdc++-6.dll不同版本的问题。按照本文的步骤:http://www.argong.com/docs/how-to-OpenCV-2.2.0.pdf并将以下行添加到CMakeLists.txt中,我希望获得与libstdc++静态链接的OpenCV dll,但OpenCV继续依赖于libstdc++-6.dll。我做错了什么让OpenCV库与libstdc++静态链接?
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()
首先确保您没有拉出链接到共享系统库的库的依赖项。例如,您可以启用编译捆绑的源组件,如zlib、jpeg等,标记为BUILD_ZLIB
、BUILD_JPEG
等。您还可以禁用对可选组件的依赖,例如Vtk (WITH_VTK
标志)和其他可能已经作为共享库存在于系统中的组件。然后,如果您将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链接器标志。