CMake编译SQLite3源文件生成.o文件失败问题求助
核心原因
你看不到.o文件是因为CMake的OBJECT目标文件默认生成在CMakeFiles/SQLite3.dir/子目录下,具体路径就是编译日志里显示的CMakeFiles/SQLite3.dir/home/rikus/Documents/git_projects/CPP-Project/libraries/sqlite/core/source/sqlite3.c.o。你设置的CMAKE_ARCHIVE_OUTPUT_DIRECTORY只控制静态库/动态库的输出路径,对OBJECT目标不生效。
解决方法
1. 直接找到已生成的.o文件
进入你的build目录,打开CMakeFiles/SQLite3.dir文件夹,就能找到编译好的sqlite3.c.o文件。
2. 自定义OBJECT文件的输出路径
如果希望.o文件统一放到指定目录,在CMake脚本中添加以下配置:
# 设置OBJECT目标文件的输出目录 set(CMAKE_OBJECT_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/obj")
这样所有OBJECT目标的.o文件会生成在build/obj目录下,方便查找和后续使用。
3. 更适合项目需求的方案:编译成静态/动态库
如果你的最终目的是将SQLite链接到主应用,直接编译成静态库或动态库会更方便,后续无需手动处理.o文件。修改add_library的配置:
# 编译成静态库(推荐,主应用编译时直接链接即可) add_library(SQLite3 STATIC ${SOURCES}) # 或者编译成动态库 # add_library(SQLite3 SHARED ${SOURCES})
编译后会在build根目录生成libSQLite3.a(静态库)或libSQLite3.so(动态库),你之前设置的CMAKE_ARCHIVE_OUTPUT_DIRECTORY会正常生效。
优化后的CMake脚本示例
去掉冗余配置,同时避免glob的潜在问题:
cmake_minimum_required(VERSION 3.27) project(SQLite3 VERSION 3.0 DESCRIPTION "SQLite3 source code" LANGUAGES C) # 直接指定源文件(不推荐glob,文件变化时CMake不会自动检测) set(SOURCES "../source/sqlite3.c") # 设置库输出路径 set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}") set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}") # 编译为静态库 add_library(SQLite3 STATIC ${SOURCES}) # 头文件目录 target_include_directories(SQLite3 PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/../headers") # 统一设置编译选项(无需分系统重复配置) target_compile_options(SQLite3 PRIVATE -Wall -Wextra -O2 -fPIC) # 指定C标准 target_compile_features(SQLite3 PRIVATE c_std_11)
注:避免使用
file(GLOB_RECURSE)的原因是,当你添加或删除源文件时,CMake不会自动重新扫描文件列表,需要手动重新运行cmake ..才能识别变化,直接指定源文件更可靠。
内容的提问来源于stack exchange,提问作者Rikus Coetzee

