SQLiteCPP编译报错:undefined reference to sqlite3_libversion(已链接-lsqlite3)
链接SQLiteCpp时出现未定义引用问题
问题背景
已完成SQLiteCpp的编译安装,步骤如下:
- 克隆SQLiteCpp仓库
- 执行
build.sh - 进入build目录,依次执行
make、make all、sudo make install - 确认头文件已复制到
/usr/local/include目录
当前VS Code task.json配置
{ "tasks": [ { "type": "cppbuild", "label": "C/C++: g++ build active file", "command": "/usr/bin/g++", "args": [ "-fdiagnostics-color=always", "-fsanitize=address", "-I/usr/local/include/", "-I/usr/local/lib/wx/include/gtk3-unicode-3.2", "-I/usr/local/include/wx-3.2", "-D_FILE_OFFSET_BITS=64", "-DWXUSINGDLL", "-D__WXGTK__", "-pthread", "-g3", "${file}", "-o", "${fileDirname}/${fileBasenameNoExtension}", "-L/usr/local/lib", "-pthread", "-lwx_gtk3u_xrc-3.2", "-lwx_gtk3u_html-3.2", "-lwx_gtk3u_qa-3.2", "-lwx_gtk3u_core-3.2", "-lwx_baseu_xml-3.2", "-lwx_baseu_net-3.2", "-lwx_baseu-3.2", "-lsqlite3", "-lSQLiteCpp" ], "options": { "cwd": "${fileDirname}" }, "problemMatcher": [ "$gcc" ], "group": { "kind": "build", "isDefault": true }, "detail": "Task generated by Debugger." } ], "version": "2.0.0" }
编译错误输出
Starting build... /usr/bin/g++ -fdiagnostics-color=always -fsanitize=address -I/usr/local/include/ -I/usr/local/lib/wx/include/gtk3-unicode-3.2 -I/usr/local/include/wx-3.2 -D_FILE_OFFSET_BITS=64 -DWXUSINGDLL -D__WXGTK__ -pthread -g3 /home/me/src/no_cmake/src/main.cpp -o /home/me/src/no_cmake/src/main -L/usr/local/lib -pthread -lwx_gtk3u_xrc-3.2 -lwx_gtk3u_html-3.2 -lwx_gtk3u_qa-3.2 -lwx_gtk3u_core-3.2 -lwx_baseu_xml-3.2 -lwx_baseu_net-3.2 -lwx_baseu-3.2 -lsqlite3 -lSQLiteCpp /usr/bin/ld: /usr/local/lib/libSQLiteCpp.a(Database.cpp.o): in function `SQLite::getLibVersion()': /home/me/src/SQLiteCpp/src/Database.cpp:52: undefined reference to `sqlite3_libversion' /usr/bin/ld: /usr/local/lib/libSQLiteCpp.a(Database.cpp.o): in function `SQLite::getLibVersionNumber()': /home/me/src/SQLiteCpp/src/Database.cpp:58: undefined reference to `sqlite3_libversion_number'
解决方法
1. 调整库的链接顺序
问题出在静态库的链接顺序:g++链接器从左到右处理库文件,当处理libSQLiteCpp.a时,它引用了sqlite3的函数,但此时libsqlite3.so还未被扫描,导致未定义引用错误。
需要将-lSQLiteCpp移到-lsqlite3之前,修改后的args部分相关内容如下:
"-lwx_baseu-3.2", "-lSQLiteCpp", "-lsqlite3"
2. 关于CMake设置的说明
你看到的几个CMake设置:
set(SQLITECPP_RUN_CPPCHECK OFF CACHE BOOL "" FORCE) set(SQLITECPP_RUN_CPPLINT OFF CACHE BOOL "" FORCE) set(SQLITECPP_USE_STATIC_RUNTIME OFF CACHE BOOL "" FORCE)
这些分别是代码检查开关、静态运行时库开关,和当前的链接错误完全无关,不需要在编译时额外配置。
内容的提问来源于stack exchange,提问作者Chemdream
相关产品推荐
相关产品推荐

