我正在尝试使用 SQLite3 编译一个小 C 程序。我已经包含头文件并将 .dll 文件转换为 .lib 文件。
有趣的是,在 windows 上,gcc (CodeBlocks) 可以毫无问题地编译源代码。但是在 Debian (Raspberry Pi) 下,我收到此错误消息:/usr/bin/ld: cannot find -lsqlite3.lib
sqlite3.lib 文件与我要编译的 main.c 文件位于同一文件夹中。(我也尝试将 .lib 文件复制到 /usr/bin/ - 没有成功)
如果我尝试在我的树莓上运行 Windows 编译的程序,我会收到另一条错误消息......
这是我的源代码:
#include <stdio.h>
#include <stdlib.h>
#include "sqlite3.h"
static int callback(void *NotUsed, int argc, char **argv, char **azColName);
int main(void){
sqlite3 *db=NULL;
int erg = 0;
char *errMsg = NULL;
erg = sqlite3_open("temp_values.db", &db);
if (erg == 1){
fprintf(stderr, "Fehler beim Oeffnen der DB!\n");
sqlite3_close(db);
return EXIT_FAILURE;
}
else fprintf(stdout, "Database connection successful!\n");
erg = sqlite3_exec(db, "CREATE TABLE IF NOT EXISTS temp_values (username TEXT, port TEXT, degrees INTEGER, humidity INTEGER, PRIMARY KEY(username, port));", callback, 0, &errMsg);
if (erg){
fprintf(stderr, "SQL error: %s\n", errMsg);
}
else fprintf(stdout, "Table check successful!\n");
erg = sqlite3_exec(db, "INSERT INTO temp_values (username, port, degrees, humidity) VALUES ('root', '4', 24, 35);", callback, 0, &errMsg);
if (erg){
fprintf(stderr, "SQL error: %s\n", errMsg);
}
else fprintf(stdout, "Inserted tuple successful!\n");
sqlite3_close(db);
return EXIT_SUCCESS;
}
static int callback(void *NotUsed, int argc, char **argv, char **azColName){
int i;
for (i = 0; i<argc; i++){
printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
}
printf("\n");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我希望有一个人可以帮助我 ...
这里最基本的问题是,您不能将在一个操作系统(例如 Windows)上构建的二进制文件(程序、目标文件、库)期望它在另一个操作系统(例如 Linux)上运行。二进制文件格式因操作系统而异。
Debian 无法识别 Windows 可执行文件和库。因此,如果您有一个使用sqlite3要在 Debian 上运行的库的程序,您需要:
sqlite3同样为 Linux 构建的库链接。第二个问题是,即使 Linuxsqlite3库被调用sqlite3.lib
(它不会被调用),并且即使sqlite3.lib在您尝试链接程序时位于当前目录中,链接器选项-lsqlite3.lib也不会使链接器能够找到它(正如你所发现的)。
GNU 链接器选项-lfoo的官方行为
是让链接器在其库搜索路径中的给定目录中搜索名为libfoo.a(静态库)或libfoo.so(动态库)的文件,并优先选择libfoo.so如果它在同一目录中找到两者。因此,-lsqlite3.lib
要求链接器找到libsqlite3.lib.so或libsqlite3.lib.a,两者都不存在。
在 Windows 上,您会发现这很-lsqlite3.lib有效。这是因为 Windows 库不遵循foo静态库是libfoo.a和foo动态库是libfoo.so的 Linux 约定。因此 GNU 链接器的 Windows 端口在-l选项中接受 Windows 样式的库名称,如此处所述。
在 Debian 上,sqlite3库的开发者包可以从包管理器作为libsqlite3-dev. 您可以以 root 身份使用以下命令安装它:
sudo apt-get install libsqlite3-dev
Run Code Online (Sandbox Code Playgroud)
安装后,你可以编译你的程序,说它是main.c,使用命令:
gcc -Wall -c -o main.o main.c
Run Code Online (Sandbox Code Playgroud)
链接它:
gcc -o prog main.o -lsqlite3
Run Code Online (Sandbox Code Playgroud)
运行:
$ ./prog
Database connection successful!
Table check successful!
Inserted tuple successful!
Run Code Online (Sandbox Code Playgroud)
小智 5
在终端中发出这个
sudo apt-get install libsqlite3-dev
Run Code Online (Sandbox Code Playgroud)
和窗口 lib 文件在 linux 中不起作用
| 归档时间: |
|
| 查看次数: |
7602 次 |
| 最近记录: |