未定义对'sqlite3_open'. I的引用,没有概念

u5i3ibmn  于 2022-11-30  发布在  SQLite
关注(0)|答案(3)|浏览(244)

我很抱歉这个标题不好。我想开始用c++使用sqlite。所以我从网站上下载了合并,并编译得到。dll

gcc -shared sqlite3.c -o sqlite3.dll

我在我的项目中包含了sqlite.h文件和.dll文件。我编译了:

g++ prueba.cpp

并收到此错误消息

C:\Users\PABLOS~1\AppData\Local\Temp\ccUI3YAt.o:prueba.cpp:(.text+0x2d): undefined reference to `sqlite3_open'
C:\Users\PABLOS~1\AppData\Local\Temp\ccUI3YAt.o:prueba.cpp:(.text+0x41): undefined reference to `sqlite3_errmsg'
collect2.exe: error: ld returned 1 exit status

好吧,我说,让我们看看堆栈溢出。在我读到的一些问题中,他们建议这样做:

g++ main.cpp sqlite3.c

但是输出的是一长串的错误信息。我继续阅读,但是大部分的问题都是通过以下方法解决的:

sudo apt install libsqlite3-dev
or
gcc main.c -lsqlite3

在其中一个问题中,问这个问题的人回答说他没有包含.a文件。所以我在谷歌上搜索了一下,并按照this article中的说明创建了.def文件:

dlltool -z sqlite3.def --export-all-symbols sqlite3.dll

并创建了.a文件

dlltool -d sqlite3.def -l libsqlite3dll.a

然后将其包含在C:\MinGW\lib中并再次尝试编译

g++ prueba.cpp -lsqlite3dll

我得到了同样的错误信息。在这一点上,我有点迷失(我是编程新手),我不知道下一步该怎么做。你能给予我一个方向,我应该去的指针吗?
编辑:回答评论中的一个问题

// This is my code
#include <iostream>
#include "sqlite3.h"

int main(int argc, char **argv) {
    // Esto es lo que necesitamos para abrir la base de datos
    sqlite3 *db;
    char *zErrMsg = NULL;
    int rc;

    // La abrimos y revisamos por errores
    rc = sqlite3_open("test.db", &db);
    if (rc) {
        std::cerr << "No se pudo abrir la base de datos: " << sqlite3_errmsg(db);
        return 1;
    }
    std::cout << "Se pudo abrir la base de datos!"<< std::endl;
    std::cin.get();
    return 0;
}
watbbzwu

watbbzwu1#

代替:

gcc -shared sqlite3.c -o sqlite3.dll

跑步:

gcc -shared sqlite3.c -o sqlite3.dll -Wl,--out-implib,libsqlite3.dll.a

这将为您提供一个.dll二进制文件和一个.a库文件。
然后改为:

g++ prueba.cpp

跑步:

g++ -shared -o prueba.exe prueba.cpp -lsqlite3

如果.exe和.dll位于同一文件夹中,则应该能够运行. exe。

vmdwslir

vmdwslir2#

构建dll时使用:

gcc -shared sqlite3.c -o sqlite3.dll -Wl,--out-implib,libsqlite3.dll.a

编译exe使用:

g++ -L . -o prueba.exe prueba.cpp -lsqlite3

对我很有效

lbsnaicq

lbsnaicq3#

今天在使用g++时再次被这个问题困扰。

请确保:
1.* “lib”前缀是静态链接库名称的一部分*"libsqlite3.lib"(我的问题是我将sqlite3.def编译为sqlite3.lib,当使用-l选项传递给g时,它无法在链接期间解析函数引用,g编译器要求库名称以“lib”作为前缀,如libsqlite3.lib中所示,并且关联的g++命令的格式应为:g++ -lsqlite3 ...
1.确保使用-L选项时库搜索路径有效
例如:g++ -Lc:\static_libs -lsqlite3 -o app.exe main.cpp
在这种情况下,库“libsqlite3.lib”的位置必须为“c:\static_libs\libsqlite3.lib”
如果只有预编译的共享库sqlite3.dll和“sqlite3.def”,则只需使用以下示例命令创建导出文件libsqlite3.exp及其关联的静态链接库libsqlite3.lib
lib.exe" /machine:x64 /def:sqlite3_x64/sqlite3.def /out:sqlite3_x64/libsqlite3.lib
lib.exe" /machine:x86 /def:sqlite3_x86/sqlite3.def /out:sqlite3_x86/libsqlite3.lib

相关问题