如何使用定义Sqlite_ENABLE_LOAD_EXTENSION编译Qt 6.4.1的Sqlite插件



我正在尝试将我的应用程序升级到Qt版本6。为了做到这一点,我需要编译MySql和Sqlite插件。Sqlite需要具有加载用户定义函数的功能,这是通过使用define Sqlite_ENABLE_load_EXTENSION 编译Sqlite3来完成的

我在这里找到了记录的程序

我最初的方法是生成Sqlite插件以使用系统Sqlite库,我已经用Sqlite_ENABLE_LOAD_EXTENSION编译了该库。以下是我的命令来构建生成构建:

qt-cmake -G "Unix Makefiles" ~/Qt/6.4.1/Src/qtbase/src/plugins/sqldrivers -DCMAKE_INSTALL_PREFIX=~/Qt/6.4.1 -DFEATURE_system_sqlite=ON -DCMAKE_INCLUDE_PATH=~/Projects/sqlite-amalgamation-3390300 -DCMAKE_LIBRARY_PATH=~/Projects/sqlite-amalgamation-3390300

不幸的是,构建插件失败:

allen@layout-pc2:~/Qt/6.4.1/Src/build sqldrivers$cmake--build
[10%]目标QMYSQLDriverPlugin_autogen的自动MOC
[10%]构建的目标QMYSQL DriverPlugin_autogen
合并编译器生成的目标QMYSQLDriverPlugin的依赖项
[50%]构建的目标QMYSQL驱动插件
[60%]目标QSQLiteDriverPlugin
[6]构建的目标QSQLite驱动插件_autogenQSQLiteDriverPlugin
[70%]正在构建CXX对象sqlite/CMakeFiles/QSXSiteDriverPlugin.dir/QSXSitedrivePlugin_autogen/mocs_compilation.cpp.o
[80%]正在创建CXX对象qlite/CMakeFiles/QSXsiteDriverPlugin.dir/qsql_sqlite.cpp.o
[90%]正在建立CXX对象sqlite/CMakeFiles\QSQLitedrivePlugin.dir/smain.cpp.o
[100%]正在链接CXX共享模块/插件/sqldrivers/libqsqlite.so/usr/bin/ld:CMakeFiles/QSQSiteDriverPlugin.dir/qsql_sqlite.cpp.o:在函数QSQLiteResultPrivate::initColumns(bool)': /home/allen/Qt/6.4.1/Src/qtbase/src/plugins/sqldrivers/sqlite/qsql_sqlite.cpp:178: <br>undefined reference tosqlite3_column_table_name16'中
collect2:错误:ld返回1退出状态gmake2:***[sqlite/CMakeFiles/QSQSiteDriverPlugin.dir/build.make:130:plugins/sqldrivers/libqsqlite.so]错误1gmake1:***[CMakeFiles/Makefile2:226:sqlite/CMakeFiles/QSQSiteDriverPlugin.dir/all]错误2gmake:***[Makefile:146:all]错误2

我发现了一篇关于此错误的帖子,未定义对`sqlite3_column_table_name16的引用

我删除了所有出现的libsqlite3.so,除了我编译但无法解决错误的那一个。然后我决定使用内置的Sqlite插件,并将我的命令更改为"-DFEATURE_ system_sqlite=OFF";删除CMakeCache.txt后。这一次我可以构建和安装插件,但我的应用程序失败了,因为它无法安装我的用户定义函数。

然后,我研究了如何将所需的定义包含在构建中,并在sqlite的~/Qt/6.4.1/Src/qtbase/Src/plugins/sqldrivers/sqlite/CMakeLists.txt中找到了构建的定义。我在定义列表中添加了define sqlite_ENABLE_LOAD_EXTENSION,并将其更改为sqlite_OMIT_LOAD_EXTENTION。我清除了build_sqldrivers文件夹并运行了configure命令,但即使构建成功,插件仍然失败,因为没有配置加载扩展。

那么,我做错了什么?


在查看输出时,我遇到了一个错误,大意是我正在使用";Unix MakeFiles";而不是";忍者;我应该自担风险去做。因此,我决定从8.4.1的新副本开始我使用了这个命令:

./configure -sql-mysql -sql-sqlite -system-sqlite

我收到一个错误:

Configuring submodule 'qtbase'
CMake Error: Error: generator : Ninja
Does not match the generator used previously: Unix Makefiles
Either remove the CMakeCache.txt file and CMakeFiles directory    or choose a different binary directory.

删除CMakeCache.txt文件和CMakeFiles目录并没有解决问题,所以我提取了6.4.1的新副本并安装了ninja:在Ubuntu 22.04 上安装忍者构建系统

我提取了6.4.1的新副本,并再次运行配置。过了一段时间,配置以结束

-- Configuring incomplete, errors occurred!
See also "/home/allen/Qt/6.4.1/Src/CMakeFiles/CMakeOutput.log".
See also "/home/allen/Qt/6.4.1/Src/CMakeFiles/CMakeError.log".
CMake Error at qtbase/cmake/QtProcessConfigureArgs.cmake:965   (message):
CMake exited with code 1.

不过,qtbase似乎已经配置好了,所以我将尝试sql驱动程序。

命令:

qt-cmake -G Ninja ~/Qt/6.4.1/Src/qtbase/src/plugins/sqldrivers -DCMAKE_INSTALL_PREFIX=~/Qt/6.4.1

返回

Qt Sql Drivers:
DB2 (IBM) .............................. no
InterBase .............................. no
MySql .................................. yes
OCI (Oracle) ........................... no
ODBC ................................... no
PostgreSQL ............................. no
SQLite ................................. yes
Using system provided SQLite ......... no

添加-DFeature_system_sqlite不起作用:

allen@layout-pc2:~/Qt/6.4.1/Src/build_sqldrivers$ qt-cmake -G Ninja ~/Qt/6.4.1/Src/qtbase/src/plugins/sqldrivers -DCMAKE_INSTALL_PREFIX=~/Qt/6.4.1 -DFEATURE_system_sqlite=YES

"system_sqlite"从OFF更改为YESCMake Warning at/home/allen/Qt/6.4.1/gcc_64/lib/CMake/Qt6/QtSetup.CMake:325(消息):

Re-configuring in existing build folder.  Some features will be
re-evaluated automatically.
Call Stack (most recent call first):
/home/allen/Qt/6.4.1/gcc_64/lib/cmake/Qt6BuildInternals/Qt6BuildInternalsConfig.cmake:237 (include)
/home/allen/Qt/6.4.1/gcc_64/lib/cmake/Qt6BuildInternals/Qt6BuildInternalsConfig.cmake:333 (qt_build_internals_set_up_private_api)
CMakeLists.txt:18 (qt_prepare_standalone_project)

CMake Warning at /home/allen/Qt/6.4.1/gcc_64/lib/cmake/Qt6/QtFeature.cmake:246 (message):
Reset FEATURE_system_sqlite value to OFF, because it doesn't meet its
condition after reconfiguration.
Call Stack (most recent call first):
/home/allen/Qt/6.4.1/gcc_64/lib/cmake/Qt6/QtFeature.cmake:396 (qt_feature_check_and_save_user_provided_value)
/home/allen/Qt/6.4.1/gcc_64/lib/cmake/Qt6/QtFeature.cmake:606 (qt_evaluate_feature)
CMakeLists.txt:36 (qt_feature_module_end)
-- Configuration summary shown below. It has also been written to /home/allen/Qt/6.4.1/Src/build_sqldrivers/config.summary
-- Configure with --log-level=STATUS or higher to increase       CMake's message verbosity. The log level does not persist across reconfigurations.
-- Configure summary:
Qt Sql Drivers:
DB2 (IBM) .............................. no
InterBase .............................. no
MySql .................................. yes
OCI (Oracle) ........................... no
ODBC ................................... no
PostgreSQL ............................. no
SQLite ................................. yes
Using system provided SQLite ......... no

-- Configuring done
-- Generating done
-- Build files have been written to: /home/allen/Qt/6.4.1    /Src/build_sqldrivers

在查看中的CMakeCache.txt中的条目时,发现了一些对SQLite的引用。在确保我的libsqlite3.so和include目录是正确的,配置成功完成,但当构建完成时,它失败了:

allen@layout-pc2:~/Qt/6.4.1/Src$cmake--内部版本。[715/10017]链接CXX共享模块qtbase/plugins/sqldrivers/libqsqlite.so失败:qtbase/plugins/sqldrivers/libqsqlite.so:&amp/usr/bin/c++-fPIC-DNDEBUG-O2-Wl,--无未定义-Wl,--版本脚本,/home/allen/Qt/6.4.1/Src/qtbase/Src/plugins/sqldrivers/sqlite/QSQLiteDriverPlugin.version-Wl,--启用新的dtag-shared-o qtbase/plugins/sqldrivers/libqsqlite.so qtbase/src/plugin/sqldrivers/sqlite/CMakeFiles/QSQSiteDriverPlugin.dir/QSQsiteDriverPlugin_autogen/mocs_compilation.cpp.o qtbase/src/plugin/siqldriverssqlite/CMakeFiles\QSQLiteDriverPlugin.dir/qsql_sqlite.cpp.o,//usr/local/lib:/home/allen/Qt/6.4.1/Src/qtbase/lib:/usr/local/lib/libsqlite3.so qtbase/lib/libQt6Sql.so.6.4.1 qtbase/lib/libQt6Core.so.6.4.1&amp;:/usr/bin/ld:qtbase/src/plugins/sqldrivers/sqlite/CMakeFiles/QSQSiteDriverPlugin.dir/qsql_sqlite.cpp.o:在函数QSQLiteResultPrivate::initColumns(bool)': qsql_sqlite.cpp:(.text+0x2496): undefined reference tosqlite3_column_table_name16'中collect2:错误:ld返回1退出状态[720/10017]正在构建CXX对象qtbase/CMakeFiles/Test.dir/make_pch.hxx.gchninja:生成已停止:子命令失败。

sqlite3_column_table_name16上未解决的错误是由于未使用DSQLITE_ENABLE_column_METADATA定义编译sqlite库造成的。使用该定义重新编译Sqlite导致成功编译Sqlite插件。所以,我相信问题已经解决了。

当我试图在FreeBSD系统中构建数据库/qt5-qldrivers-sqlite3端口时,也遇到了类似的问题。

在数据库/sqlite3中启用MATADATA选项后,一切正常。

最新更新