如何用*.a静态库创建*.dll共享库?CMake构建报错求助
用静态库构建DLL时CMake报错的解决方案
首先,我来帮你分析下问题:你尝试将MinGW编译的libgdal.a静态库链接到一个DLL共享库,但CMake提示找不到该静态库文件,而构建静态库时却能正常工作。这大概率是路径配置或者链接语法的问题,下面是具体的解决步骤:
1. 确认静态库路径的准确性
CMake的相对路径是基于构建目录而非CMakeLists.txt所在目录的,这很容易导致路径歧义。你可以改用基于当前CMakeLists.txt的绝对路径来定位库文件,这样更可靠:
将原配置中的路径改为:
"${CMAKE_CURRENT_SOURCE_DIR}/../msys64/mingw64/lib/libgdal.a"
CMAKE_CURRENT_SOURCE_DIR是CMake内置变量,指向当前CMakeLists.txt所在的目录,用它拼接路径能避免工作目录变化带来的问题。
2. 修正导入库的配置与链接语法
你的target_link_libraries命令里出现了A和C,如果这不是你需要的其他库,那属于无效输入,需要移除。同时建议使用CMake现代的链接范围关键字(PRIVATE/PUBLIC/INTERFACE)来明确依赖关系:
修正后的导入库配置和链接命令如下:
add_library(libgdal STATIC IMPORTED) set_target_properties(libgdal PROPERTIES IMPORTED_LOCATION "${CMAKE_CURRENT_SOURCE_DIR}/../msys64/mingw64/lib/libgdal.a" ) target_link_libraries(Projects1 PRIVATE libgdal)
3. 提前验证文件是否存在
可以在CMake配置阶段就检测静态库是否存在,避免到构建阶段才报错。在配置导入库之前添加这段代码:
file(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/../msys64/mingw64/lib/libgdal.a" GDAL_FILE_EXISTS) if(NOT GDAL_FILE_EXISTS) message(FATAL_ERROR "Error: libgdal.a not found at ${CMAKE_CURRENT_SOURCE_DIR}/../msys64/mingw64/lib/libgdal.a") endif()
4. 确保静态库的兼容性
另外需要注意:你用来构建DLL的MinGW编译器,必须和编译libgdal.a的环境一致(比如同为64位或32位),否则即使路径正确,也可能出现链接错误。
完整修正后的CMakeLists.txt示例
cmake_minimum_required(VERSION 3.10) project(Projects) set(CMAKE_CXX_STANDARD 11) # 使用绝对路径拼接包含目录,避免路径问题 include_directories( ${CMAKE_CURRENT_SOURCE_DIR}/../msys64/mingw64/include "${CMAKE_CURRENT_SOURCE_DIR}/../Program Files/Java/jdk1.8.0_151/include" "${CMAKE_CURRENT_SOURCE_DIR}/../Program Files/Java/jdk1.8.0_151/include/win32" ) add_library(Projects1 SHARED main.cpp HelloWorld.cpp ) # 提前检测静态库是否存在 file(EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/../msys64/mingw64/lib/libgdal.a" GDAL_FILE_EXISTS) if(NOT GDAL_FILE_EXISTS) message(FATAL_ERROR "Error: libgdal.a not found at specified path!") endif() # 配置导入的静态库 add_library(libgdal STATIC IMPORTED) set_target_properties(libgdal PROPERTIES IMPORTED_LOCATION "${CMAKE_CURRENT_SOURCE_DIR}/../msys64/mingw64/lib/libgdal.a" ) # 链接静态库到共享库 target_link_libraries(Projects1 PRIVATE libgdal)
按照上面的步骤调整后,重新运行CMake配置和构建,应该就能解决找不到静态库的问题了。
内容的提问来源于stack exchange,提问作者Niraj Sanghani
相关产品推荐
相关产品推荐

