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

如何通过CMake将libxlsxwriter库接入个人C++项目?

如何通过CMake正确接入libxlsxwriter库

我从GitHub克隆了libxlsxwriter官方库文件,解压到个人C++项目中,添加了一段CMake配置代码后出现错误,想请教正确的接入方式。

我的CMake配置代码如下:

cmake_minimum_required(VERSION 3.11.0)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

include(FetchContent)
FetchContent_Declare(
  googletest
  GIT_REPOSITORY https://github.com/google/googletest.git
  GIT_TAG        main # release-1.10.0
)

include(FetchContent)
FetchContent_Declare(
        Bcrypt
        GIT_REPOSITORY https://github.com/veltro123/Bcrypt.cpp
        GIT_TAG master
)
FetchContent_MakeAvailable(Bcrypt)
# For Windows: Prevent overriding the parent project's compiler/linker settings
set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
FetchContent_MakeAvailable(googletest)

#ADDED
include_directories("libxlsxwriter/include")
set(XLSXWRITER_LIBRARY "libxlsxwriter/build/libxlsxwriter.a")
add_library(xlsxwriter STATIC IMPORTED)
set_target_properties(xlsxwriter PROPERTIES IMPORTED_LOCATION ${XLSXWRITER_LIBRARY})
target_link_libraries(${PROJECT_NAME} xlsxwriter)
#END

project(MONEYTRACKER)
enable_testing()

add_executable(${PROJECT_NAME} main.cpp Src/Transaction.cpp Src/Date.cpp Src/User.cpp)
add_executable(${PROJECT_NAME}-ut Testing/DateTests.cpp Testing/UserTests.cpp Src/Transaction.cpp Src/Date.cpp Src/User.cpp)

target_link_libraries(${PROJECT_NAME}-ut gtest_main)
target_link_libraries(${PROJECT_NAME} PRIVATE bcrypt)

include(GoogleTest)
gtest_discover_tests(${PROJECT_NAME}-ut)

错误提示:Cannot specify link libraries for target "MONEYTRACKER" which is not built by this project.


问题根源

你在project(MONEYTRACKER)声明之前就调用了target_link_libraries(${PROJECT_NAME} xlsxwriter),此时${PROJECT_NAME}变量还未被CMake定义,自然识别不到这个目标,导致报错。另外手动指定静态库路径的方式兼容性差,推荐用CMake标准流程处理依赖。

正确接入方案

方案一:用FetchContent自动拉取构建(推荐)

无需手动克隆库,CMake会自动完成拉取、编译、链接,跨平台更省心:

修改后的CMake代码:

cmake_minimum_required(VERSION 3.11.0)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# 先声明项目,确保PROJECT_NAME变量有效
project(MONEYTRACKER)
enable_testing()

include(FetchContent)

# 拉取googletest
FetchContent_Declare(
  googletest
  GIT_REPOSITORY https://github.com/google/googletest.git
  GIT_TAG        release-1.14.0 # 建议用稳定版本,比main分支可靠
)

# 拉取Bcrypt
FetchContent_Declare(
        Bcrypt
        GIT_REPOSITORY https://github.com/veltro123/Bcrypt.cpp
        GIT_TAG master
)

# 拉取libxlsxwriter
FetchContent_Declare(
        libxlsxwriter
        GIT_REPOSITORY https://github.com/jmcnamara/libxlsxwriter.git
        GIT_TAG RELEASE_1.1.5 # 指定稳定版本标签,避免main分支的不稳定代码
)

# 构建所有依赖
FetchContent_MakeAvailable(Bcrypt googletest libxlsxwriter)

# Windows下避免覆盖父项目编译/链接设置
set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)

# 生成可执行文件
add_executable(${PROJECT_NAME} main.cpp Src/Transaction.cpp Src/Date.cpp Src/User.cpp)
add_executable(${PROJECT_NAME}-ut Testing/DateTests.cpp Testing/UserTests.cpp Src/Transaction.cpp Src/Date.cpp Src/User.cpp)

# 链接依赖库
target_link_libraries(${PROJECT_NAME} PRIVATE bcrypt xlsxwriter)
target_link_libraries(${PROJECT_NAME}-ut PRIVATE gtest_main)

include(GoogleTest)
gtest_discover_tests(${PROJECT_NAME}-ut)

方案二:手动导入已克隆的libxlsxwriter

如果坚持手动克隆库到本地,先确保库已编译,再调整CMake代码:

  1. 先编译libxlsxwriter:进入libxlsxwriter目录,执行mkdir build && cd build && cmake .. && make(Linux/macOS);Windows用户用CMake GUI生成工程后编译。

  2. 修改后的CMake代码:

cmake_minimum_required(VERSION 3.11.0)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

# 先声明项目
project(MONEYTRACKER)
enable_testing()

include(FetchContent)
FetchContent_Declare(
  googletest
  GIT_REPOSITORY https://github.com/google/googletest.git
  GIT_TAG        main # release-1.10.0
)

FetchContent_Declare(
        Bcrypt
        GIT_REPOSITORY https://github.com/veltro123/Bcrypt.cpp
        GIT_TAG master
)
FetchContent_MakeAvailable(Bcrypt)

set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
FetchContent_MakeAvailable(googletest)

# 导入本地编译好的libxlsxwriter
add_library(xlsxwriter STATIC IMPORTED)
set_target_properties(xlsxwriter PROPERTIES
        IMPORTED_LOCATION "${CMAKE_CURRENT_SOURCE_DIR}/libxlsxwriter/build/libxlsxwriter.a"
        INTERFACE_INCLUDE_DIRECTORIES "${CMAKE_CURRENT_SOURCE_DIR}/libxlsxwriter/include"
)

# 生成可执行文件
add_executable(${PROJECT_NAME} main.cpp Src/Transaction.cpp Src/Date.cpp Src/User.cpp)
add_executable(${PROJECT_NAME}-ut Testing/DateTests.cpp Testing/UserTests.cpp Src/Transaction.cpp Src/Date.cpp Src/User.cpp)

# 链接依赖库
target_link_libraries(${PROJECT_NAME} PRIVATE bcrypt xlsxwriter)
target_link_libraries(${PROJECT_NAME}-ut PRIVATE gtest_main)

include(GoogleTest)
gtest_discover_tests(${PROJECT_NAME}-ut)

关键注意事项

  • 必须先声明project()再用${PROJECT_NAME}:CMake只有执行project()后才会初始化这个变量,提前调用会导致变量无效。
  • 优先用FetchContent:自动处理依赖的全流程,减少手动操作的出错概率,跨平台兼容性更好。
  • 链接库时加PRIVATE:如果库只在项目内部代码中使用,用PRIVATE符合CMake现代最佳实践,避免不必要的依赖暴露。

内容的提问来源于stack exchange,提问作者veltronic

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 15:05:31