CMake未生成.dll文件反而创建.dir文件夹问题求助
Windows CLion + CMake 生成DLL完整解决方案
你当前生成的默认构建文件夹结构如下:
没有生成预期的DLL是因为CMake配置和参数选择错误,按照以下步骤操作即可得到可直接外部调用的QuadCopter.dll文件。
前置检查:确认工具链配置
- 打开CLion设置→构建、执行、部署→工具链,确认使用的是MinGW(无需Visual Studio推荐选MinGW-w64,不要用Cygwin),路径配置正确,cmake、make、gcc/g++编译器都能正常识别
- 不要使用STATIC参数,STATIC生成的是静态链接库.lib,只有SHARED参数才会生成动态库.dll
第一步:修改CMakeLists.txt配置
替换你原有的CMake内容为以下配置:
cmake_minimum_required(VERSION 3.20) project(QuadCopter) # 开启Windows下自动导出所有符号,无需手动加dllexport标记 set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON) # 生成动态库必须用SHARED参数 add_library(QuadCopter SHARED main.h main.cpp) # 可选:指定DLL输出路径,避免到深层build目录找 set_target_properties(QuadCopter PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/output LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/output ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/output )
上述配置中CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS为Windows平台特有参数,开启后会自动把所有函数和全局变量导出到DLL,无需手动给每个函数加__declspec(dllexport)标记,降低新手配置成本。输出路径配置可以让你直接在项目根目录的output文件夹找到生成的DLL,不用到build目录下翻找。
第二步:验证导出函数正确性
如果需要外部调用DLL里的函数,确保需要导出的函数已经在头文件中明确声明,示例如下:
// main.h示例代码 #ifndef QUADCOPTER_MAIN_H #define QUADCOPTER_MAIN_H // 你需要导出的函数声明 void init_quadcopter(); int get_sensor_data(); #endif //QUADCOPTER_MAIN_H
main.cpp中正常实现对应的函数即可,不需要加额外标记。
第三步:重新构建项目
- 点击CLion顶部的文件→重新加载CMake项目
- 点击构建按钮(或按Ctrl+F9)执行构建
- 到你配置的output目录(如果未配置输出路径就到build目录下的对应生成文件夹)就能找到
QuadCopter.dll文件,同时会生成配套的.lib导入库,外部调用DLL的时候需要用到这个.lib做链接。
常见问题排查
- 如果还是没生成DLL:检查CMakeLists.txt里是否确实使用了SHARED而不是STATIC,确认工具链没有配置成Visual Studio的MSVC(使用MSVC需要额外安装独立构建工具,无VS环境下还是推荐MinGW)
- 外部调用DLL找不到函数:确认你要调用的函数已经在头文件里声明,已开启
CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS参数,或手动给函数加了__declspec(dllexport)标记。
内容的提问来源于stack exchange,提问作者Joshua Unrau
相关产品推荐
相关产品推荐

