如何通过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代码:
先编译libxlsxwriter:进入
libxlsxwriter目录,执行mkdir build && cd build && cmake .. && make(Linux/macOS);Windows用户用CMake GUI生成工程后编译。修改后的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
相关产品推荐
相关产品推荐

