如何通过CMake链接自定义库?执行时DLL缺失问题求助
运行Hello.exe提示找不到libmy_library.dll的解决办法
问题根源
你编译的是动态共享库(SHARED),Windows下运行EXE时,依赖的DLL必须和EXE在同一目录,或者在系统能识别的PATH路径里。用MinGW编译时,libmy_library.dll默认生成在build/my_library文件夹里,而Hello.exe在build根目录,系统找不到这个DLL,所以报错。
三种解决办法
办法1:让CMake自动把DLL复制到EXE目录
直接修改根目录的CMakeLists.txt,在target_link_libraries这一行后面加一段代码:
# 编译完成后自动复制DLL到EXE所在目录 add_custom_command(TARGET ${PROJECT_NAME} POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy_if_different $<TARGET_FILE:my_library> $<TARGET_FILE_DIR:${PROJECT_NAME}> )
这段代码会在Hello.exe编译好之后,自动把my_library生成的DLL复制到EXE的输出目录,运行时就能直接找到。
办法2:改成静态库(不用依赖DLL)
如果不需要动态库,把my_library文件夹里的CMakeLists.txt里的SHARED改成STATIC:
add_library(my_library STATIC ${SOURCES})
静态库会把代码直接打包进EXE,运行时不需要额外的DLL文件,一步到位。
办法3:临时把DLL路径加到系统PATH
打开cmd,输入下面的命令(把路径换成你实际的build目录):
set PATH=%PATH%;你的项目路径\build\my_library
不过这个方法每次打开新的cmd都要重新执行,适合临时测试用,不推荐长期使用。
验证步骤
修改完CMake配置后,重新执行构建命令:
mkdir build && cd build cmake .. -G "MinGW Makefiles" mingw32-make
再运行Hello.exe就不会报错了。
内容的提问来源于stack exchange,提问作者Jairo Qlmbqn
相关产品推荐
相关产品推荐

