You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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()'

错误原因

  1. 导入库的TARGET命名不规范:CMake目标名称不能包含.,test.lib作为目标名会导致链接逻辑异常。
  2. IMPORT_LOCATION属性设置错误:该属性需要指向具体的库文件路径(test.lib),而非目录。
  3. 链接关键字使用错误:target_link_libraries中用INTERFACE不合适,对于可执行文件,应使用PRIVATE或PUBLIC(根据依赖是否需要传递)。
  4. 重复添加库文件: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 03:46:05