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

CMake编译SQLite3源文件生成.o文件失败问题求助

问题解决: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 00:22:40