在windows上使用cmake 指令引入 自己编译的 静态库

在windows上使用cmake 指令引入 自己编译的 静态库,执行cmake没问题,但是构建就有问题。
cmakeList中代码

cmake_minimum_required(VERSION 3.5)

project(testF VERSION 0.1 LANGUAGES CXX)

set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTORCC ON)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Widgets)
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Widgets)

set(PROJECT_SOURCES
        main.cpp
        mainwindow.cpp
        mainwindow.h
        mainwindow.ui
)

if(${QT_VERSION_MAJOR} GREATER_EQUAL 6)
    qt_add_executable(testF
        MANUAL_FINALIZATION
        ${PROJECT_SOURCES}
    )
# Define target properties for Android with Qt 6 as:
#    set_property(TARGET testF APPEND PROPERTY QT_ANDROID_PACKAGE_SOURCE_DIR
#                 ${CMAKE_CURRENT_SOURCE_DIR}/android)
# For more information, see https://doc.qt.io/qt-6/qt-add-executable.html#target-creation
else()
    if(ANDROID)
        add_library(testF SHARED
            ${PROJECT_SOURCES}
        )
# Define properties for Android with Qt 5 after find_package() calls as:
#    set(ANDROID_PACKAGE_SOURCE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/android")
    else()
        add_executable(testF
            ${PROJECT_SOURCES}
        )
    endif()
endif()

target_link_libraries(testF PRIVATE Qt${QT_VERSION_MAJOR}::Widgets)

set_target_properties(testF PROPERTIES
    MACOSX_BUNDLE_GUI_IDENTIFIER my.example.com
    MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION}
    MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}
    MACOSX_BUNDLE TRUE
    WIN32_EXECUTABLE TRUE
)

install(TARGETS testF
    BUNDLE DESTINATION .
    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR})

if(QT_VERSION_MAJOR EQUAL 6)
    qt_finalize_executable(testF)
endif()
target_include_directories(${PROJECT_NAME} PUBLIC ${PROJECT_SOURCE_DIR}/third_party/ctemplate/win/include)
target_link_directories(${PROJECT_NAME} PUBLIC  "${PROJECT_SOURCE_DIR}/third_party/ctemplate/win/lib")
target_link_libraries(${PROJECT_NAME} PRIVATE ctemplate)


img

img

执行cmake结果

img


在项目中 引用 不报错

img


构建报错

img


本来生成的就是加前缀的libctemplate.lib,即使改成了 ctemplate.lib,构建不报错,但是执行程序报错,找不到 libctemplate.lib

看一下引入的库名称对不对,lib库文件

LNK1104无法打开指定lib的问题,一般是库的名称或者路径不正确导致的。首先要确保库的路径和相关的依赖是否配置正确,这个是基本的。
排除完这个,如果还有问题,检查下库的路径格式是否有中文或者非法字符什么的。
还有就是可以考虑是否是目录深度的问题,可以考虑将目录深度缩短。

以下答案由GPT-3.5大模型与博主波罗歌共同编写:
根据你提供的信息,可以看到你的CMakeLists.txt中确实正确使用了target_include_directories、target_link_directories和target_link_libraries添加依赖库的路径和库文件。

但是根据你的描述,生成的库文件名是libctemplate.lib,这个库文件名字前缀带有"lib"。这符合Linux系统的命名规范,但不符合Windows系统的命名规范。在Windows上,静态库文件命名的约定是名称为library.lib,而不是liblibrary.lib。这就是为什么在Windows上,C/C++库的名字通常是不带“lib”前缀的。

因此,尝试将静态库文件名字由libctemplate.lib改为ctemplate.lib,也可以将:

target_link_libraries(${PROJECT_NAME} PRIVATE ctemplate)

修改为:

target_link_libraries(${PROJECT_NAME} PRIVATE ${CMAKE_STATIC_LIBRARY_PREFIX}ctemplate${CMAKE_STATIC_LIBRARY_SUFFIX})

这样CMake就会使用正确的静态库名称在构建时链接库。

另外,如果还有其他错误,可以在问答中提供详细的错误输出以供分析。
如果我的回答解决了您的问题,请采纳!