我很抱歉这个标题不好。我想开始用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;
}
3条答案
按热度按时间watbbzwu1#
代替:
跑步:
这将为您提供一个.dll二进制文件和一个.a库文件。
然后改为:
跑步:
如果.exe和.dll位于同一文件夹中,则应该能够运行. exe。
vmdwslir2#
构建dll时使用:
编译exe使用:
对我很有效
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