Windows下Qt CMake项目使用.lib库出现未定义引用错误
解决CMake链接静态库时的“undefined reference”错误
问题场景
从Visual Studio迁移项目到CMake环境,使用第三方静态库test.lib时,CMake配置无报错,但构建阶段出现undefined reference to libtest::libtest()错误。相关代码如下:
原CMakeLists.txt
cmake_minimum_required(VERSION 3.14) project(LibTest LANGUAGES CXX) set(CMAKE_INCLUDE_CURRENT_DIR ON) set(CMAKE_AUTOUIC ON) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTORCC ON) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(LIB_TEST_DIR ${CMAKE_CURRENT_SOURCE_DIR}/lib/) set(LIB_TEST ${CMAKE_CURRENT_SOURCE_DIR}/lib/test.lib) #find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Core) #find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Core) add_executable(LibTest main.cpp lib/test.lib) target_include_directories(LibTest PUBLIC ${LIB_TEST_DIR}) add_library(test.lib STATIC IMPORTED ${LIB_TEST}) set_property(TARGET test.lib PROPERTY IMPORT_LOCATION ${LIB_TEST_DIR}) #target_link_libraries(LibTest Qt${QT_VERSION_MAJOR}::Core) target_link_libraries(LibTest INTERFACE test.lib) install(TARGETS LibTest LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR})
main.cpp
#include "libtest.hpp" int main(int argc, char *argv[]) { libtest test; //QCoreApplication a(argc, argv); return 0; }
构建错误
:-1: error: /LibTest/main.cpp:9: undefined reference to `libtest::libtest()'
错误原因
- 导入库的TARGET命名不规范:CMake目标名称不能包含
.,test.lib作为目标名会导致链接逻辑异常。 - IMPORT_LOCATION属性设置错误:该属性需要指向具体的库文件路径(
test.lib),而非目录。 - 链接关键字使用错误:
target_link_libraries中用INTERFACE不合适,对于可执行文件,应使用PRIVATE或PUBLIC(根据依赖是否需要传递)。 - 重复添加库文件:
add_executable中已写入lib/test.lib,后续又通过导入库链接,属于重复操作且干扰CMake链接逻辑。
修正后的CMakeLists.txt
cmake_minimum_required(VERSION 3.14) project(LibTest LANGUAGES CXX) set(CMAKE_INCLUDE_CURRENT_DIR ON) set(CMAKE_AUTOUIC ON) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTORCC ON) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(LIB_TEST_DIR ${CMAKE_CURRENT_SOURCE_DIR}/lib/) set(LIB_TEST_PATH ${CMAKE_CURRENT_SOURCE_DIR}/lib/test.lib) # 若需要Qt,取消注释以下两行 #find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Core) #find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Core) # 仅添加源文件到可执行目标 add_executable(LibTest main.cpp) # 设置头文件目录 target_include_directories(LibTest PRIVATE ${LIB_TEST_DIR}) # 正确声明导入静态库,使用合法目标名test_lib add_library(test_lib STATIC IMPORTED) # 设置导入库的具体路径 set_property(TARGET test_lib PROPERTY IMPORT_LOCATION ${LIB_TEST_PATH}) # 链接导入库,使用PRIVATE关键字 target_link_libraries(LibTest PRIVATE test_lib) # 若需要Qt,取消注释以下行 #target_link_libraries(LibTest PRIVATE Qt${QT_VERSION_MAJOR}::Core) install(TARGETS LibTest LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR})
内容的提问来源于stack exchange,提问作者DukeOfEast
相关产品推荐
相关产品推荐

