3

我需要编译与 libstdc++ 静态链接的 OpenCV,以避免 Qt5 和 OpenCV 所需的 libstdc++-6.dll 的不同 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()
4

1 回答 1

1

首先确保您没有对链接到共享系统库的库进行依赖。BUILD_ZLIB例如,您可以使用 flags等启用捆绑源组件(如 zlib、jpeg 等)的编译BUILD_JPEG。您还可以禁用对可选组件(如 Vtk(WITH_VTK标志)和其他可能已经作为共享库存在于系统中的组件的依赖关系) . 然后,如果您将 OpenCV 构建为共享库,请使用以下命令将设置推送到CMAKE_SHARED_LINKER_FLAGS缓存中的共享链接器标志变量 ( ) cmake -C

set(CMAKE_SHARED_LINKER_FLAGS "-static -static-libgcc -static-libstdc++" CACHE INTERNAL "" FORCE)

或者,如果您使用 静态编译 OpenCV -DBUILD_SHARED_LIBS=FALSE,您可以插入 gcc 链接器标志以在最终共享对象或可执行文件上进行静态链接。

于 2018-05-06T23:52:17.347 回答