如何仅保留cygwin1.dll动态链接、其余所有dll均静态编译进程序?
核心问题原因
- 你设置的
CMAKE_CXX_FLAGS加-static只作用于你自己写的代码的编译环节,不会改变CMake查找依赖库的优先级:Cygwin下默认优先找.dll动态库,只有找不到动态库的时候才会找.a静态库,你当前find_package拿到的ImageMagick_LIBRARIES全是动态库的链接路径,自然不会做静态嵌入。 - ImageMagick本身依赖大量第三方库(比如你报错里提到的bz2、cairo、autotrace等等),就算你指定了ImageMagick用静态库,你也得保证这些依赖的静态版本都已经安装,且链接时能被正确找到。
具体修复步骤
第一步:先安装所有依赖的静态库
打开Cygwin的安装器,安装以下包的lib*-devel版本,确保带.a静态库文件:
- ImageMagick的静态开发包:
libMagick++-devel、libMagickCore-devel - 依赖库的静态开发包:
libbz2-devel、libcairo-devel、libautotrace-devel、libpng-devel、libjpeg-devel、libtiff-devel等所有你报错里提到的缺失dll对应的开发包
第二步:修改CMake配置,强制静态链接
把你原来的CMakeLists.txt改成如下配置,核心是强制CMake优先找静态库,同时指定链接参数强制静态绑定所有依赖:
cmake_minimum_required(VERSION 3.5) project(Photomosaics LANGUAGES CXX) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) # 强制CMake优先查找静态库,优先级高于动态库 set(CMAKE_FIND_LIBRARY_SUFFIXES .a ${CMAKE_FIND_LIBRARY_SUFFIXES}) # 全局链接参数,强制所有依赖静态链接,注意-static要同时加在链接参数里,不是只加在编译参数 set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static -static-libgcc -static-libstdc++") add_executable(Photomosaics main.cpp) add_definitions(-DMAGICKCORE_QUANTUM_DEPTH=16) add_definitions(-DMAGICKCORE_HDRI_ENABLE=0) # 查找ImageMagick时指定要静态版本 set(ImageMagick_STATIC ON) find_package(ImageMagick COMPONENTS Magick++ MagickCore REQUIRED) include_directories(${ImageMagick_INCLUDE_DIRS}) target_link_libraries(Photomosaics ${ImageMagick_LIBRARIES})
第三步:重新编译
删除之前的CMake缓存目录(就是你build文件夹里的所有内容),重新运行cmake生成Makefile再编译,生成的可执行文件就只会依赖cygwin1.dll了。
额外注意事项
- 如果还是提示找不到某个静态库,直接去Cygwin的
/lib目录下确认对应库的.a文件是否存在,不存在就安装对应的devel包。 - 不要用Cygwin下的MinGW编译链,就用原生Cygwin的gcc/g++,否则生成的文件不会依赖
cygwin1.dll,而是依赖MinGW的运行时库。
内容的提问来源于stack exchange,提问作者user17041628
相关产品推荐
相关产品推荐

