如何用CMake生成可在无依赖Windows设备运行的C++独立可执行文件
生成可在无依赖Windows设备运行的OpenCV程序可执行文件
针对你的场景,有两种可行方案,分别适合不同需求:
方法一:静态编译(推荐,无需额外携带DLL)
静态编译会把所有依赖的库(包括OpenCV和C++标准库)直接打包进exe,目标机器不需要安装任何依赖就能运行。
步骤:
重新编译OpenCV为静态库
- 下载OpenCV源码,用CMake配置时,把
BUILD_SHARED_LIBS设为OFF,同时将CMAKE_BUILD_TYPE设为Release,指定MinGW作为编译器。 - 编译完成后,会得到后缀为
.a的静态版本OpenCV库。
- 下载OpenCV源码,用CMake配置时,把
修改CMakeLists.txt适配静态编译
调整配置,让程序链接静态库,同时静态链接C++标准库:cmake_minimum_required(VERSION 3.5) project(CirclesDetectionProject VERSION 0.1) set(CMAKE_INCLUDE_CURRENT_DIR ON) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_BUILD_TYPE Release CACHE STRING "Build type" FORCE) # 静态链接MinGW的C++标准库,避免依赖系统DLL set(CMAKE_EXE_LINKER_FLAGS "-static -static-libgcc -static-libstdc++") # 指向静态版本OpenCV的编译目录 find_package(OpenCV REQUIRED PATHS "C:/opencv-static-build/x64/mingw64/") include_directories(${OpenCV_INCLUDE_DIRS}) set(PROJECT_SOURCES main.cpp ) add_executable(CirclesDetection ${PROJECT_SOURCES}) # 链接静态OpenCV库 target_link_libraries(CirclesDetection ${OpenCV_LIBS})重新编译程序
- 清空之前的构建目录,重新运行
cmake .. -G "MinGW Makefiles",再执行mingw32-make,生成的exe就是独立可运行的。
- 清空之前的构建目录,重新运行
方法二:动态库打包(快速实现,需携带DLL)
如果不想重新编译OpenCV静态库,可以直接打包程序所需的所有动态库:
步骤:
收集必要的DLL文件
- 找到编译好的
CirclesDetection.exe。 - 打开MinGW终端,运行
ldd CirclesDetection.exe,查看exe依赖的所有DLL路径。 - 收集两类DLL:
- OpenCV动态库:比如
opencv_core4xx.dll、opencv_imgproc4xx.dll(xx为你的OpenCV版本号),在C:/opencv/build/x64/mingw64/bin目录下。 - MinGW标准库:比如
libstdc++-6.dll、libgcc_s_seh-1.dll、libwinpthread-1.dll,在MinGW安装目录的bin文件夹下。
- OpenCV动态库:比如
- 找到编译好的
打包分发
- 将所有收集到的DLL和
CirclesDetection.exe放在同一个文件夹,压缩后即可分发到其他Windows设备,直接运行exe即可。
- 将所有收集到的DLL和
注意事项:
- 静态编译生成的exe体积会大很多,但无需额外文件;动态打包的exe体积小,但必须和DLL一起分发。
- 务必用
Release模式编译,Debug模式的exe依赖Debug版本库,无法在无开发环境的机器运行。 - 系统自带的DLL(比如
kernel32.dll)不需要打包,所有Windows设备都自带。
内容的提问来源于stack exchange,提问作者Ja_cpp
相关产品推荐
相关产品推荐

