CMake在C++项目中未编译指定C文件引发链接错误求助
问题:CMake链接SQLite出现未解析外部符号错误
我尝试在C++项目中通过CMake链接SQLite,配置代码如下:
cmake_minimum_required(VERSION 3.5) project(SQLITE++ VERSION 0.1 LANGUAGES CXX) set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(SQLITE3_HOME "src/sqlite3/sqlite-amalgamation-3360000") set(SQLITE3_CORE_C "${SQLITE3_HOME}/sqlite3.c") # Tell CMake to compile this with C++ compiler set_source_files_properties(SQLITE3_CORE_C PROPERTIES LANGUAGE CXX ) file(GLOB sqlitepp_SRC "src/**.cpp") add_library( sqlite3++ STATIC ${SQLITE3_CORE_C} ${sqlitepp_SRC} )
但配置未生效,出现链接错误:
error LNK2019: unresolved external symbol sqlite3_close_v2
值得注意的是,相同源码在Visual Studio项目中可正常构建。SQLite头文件已设置extern "C",排除该原因。我在sqlite3.c中加入无效代码未触发编译错误,说明该文件未被编译;但指定错误文件名会触发报错,表明CMake能找到该文件但未将其加入构建。
解决方案
核心问题定位
set_source_files_properties命令的参数使用错误:你传入的是变量名SQLITE3_CORE_C而非变量展开后的文件路径,导致CMake无法识别目标文件,自然不会将其加入构建流程。
修正后的CMake配置
cmake_minimum_required(VERSION 3.5) project(SQLITE++ VERSION 0.1 LANGUAGES CXX) set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(SQLITE3_HOME "src/sqlite3/sqlite-amalgamation-3360000") set(SQLITE3_CORE_C "${SQLITE3_HOME}/sqlite3.c") # 展开变量,为实际文件路径设置编译属性 set_source_files_properties(${SQLITE3_CORE_C} PROPERTIES LANGUAGE CXX ) # 替换为跨平台的递归匹配写法 file(GLOB_RECURSE sqlitepp_SRC "src/*.cpp") add_library( sqlite3++ STATIC ${SQLITE3_CORE_C} # 确保变量展开,实际文件被加入库 ${sqlitepp_SRC} )
额外优化建议
- 跨平台源文件匹配:原
src/**.cpp的写法并非所有CMake版本/平台都支持,换成GLOB_RECURSE更稳妥。 - 避免强制C++编译SQLite:如果不需要用C++特性编译sqlite3.c,可直接保留C语言编译:
- 将project声明改为
project(SQLITE++ VERSION 0.1 LANGUAGES C CXX) - 删除
set_source_files_properties那一行 - 利用头文件的
extern "C"包裹,即可正常链接C语言编译的SQLite符号。
- 将project声明改为
内容的提问来源于stack exchange,提问作者Tomáš Zato
相关产品推荐
相关产品推荐

