GCC Compile Error: /usr/bin/ld: cannot find -lsqlite3.lib
GCC Compile Error: /usr/bin/ld: cannot find -lsqlite3.lib
我正在尝试使用 SQLite3 编译一个小的 C 程序。我已经包含了头文件并将 .dll 文件转换为 .lib 文件。
有趣的是,在windows上,gcc (CodeBlocks) 可以毫无问题地编译源代码。但在 Debian (Raspberry Pi) 下,我收到此错误消息:/usr/bin/ld: 找不到 -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;
}
希望有人能帮帮我...
在终端中发出这个
sudo apt-get install libsqlite3-dev
和 window lib 文件在 linux
中不起作用
这里最基本的问题是你不能把一个二进制文件(一个程序,
您在一个操作系统(例如 Windows)上构建的对象文件、库)并期望
它可以在另一个操作系统上运行(例如 Linux)。二进制文件格式不同
操作系统之间。
Windows Debian 无法识别可执行文件和库。所以如果你
有一个使用 sqlite3
库的程序,你想在 Debian 上 运行,
你需要:
- 在 Debian 上编译源文件以创建 Linux 个目标文件。
- Link 带有
sqlite3
库的目标文件也已为 Linux. 构建
第二个问题是,即使 Linux sqlite3
库被调用 sqlite3.lib
(它不会是),即使 sqlite3.lib
在当前目录中
您尝试 link 您的程序,linker 选项 -lsqlite3.lib
将不会启用
linker 找到它(如您所见)。
offical behaviour of the GNU linker option -l
foo
是让 linker 在其库搜索路径中搜索给定目录
名为 libfoo.a(静态库)或 libfoo.so(动态库)的文件和
如果在同一目录中找到两者,则更喜欢 libfoo.so 。因此,-lsqlite3.lib
要求 linker 找到 libsqlite3.lib.so
或 libsqlite3.lib.a
,两者都不是
存在。
在 Windows 上,您会发现 -lsqlite3.lib
有效。那是因为 Windows
库不遵循 Linux 约定,即 foo 静态库
是 libfoo.a 而 foo 动态库是 libfoo.so。所以 Windows 端口
的 GNU linker 在 -l
选项中接受 Windows 风格的库名称,正如 所解释的
这里.
在 Debian 上,sqlite3
库的开发包可以从
包管理器为 libsqlite3-dev
。您可以以 root 身份使用以下命令安装它:
sudo apt-get install libsqlite3-dev
安装后,你可以编译你的程序,假设它是main.c
,使用命令:
gcc -Wall -c -o main.o main.c
Link它:
gcc -o prog main.o -lsqlite3
运行它:
$ ./prog
Database connection successful!
Table check successful!
Inserted tuple successful!
我正在尝试使用 SQLite3 编译一个小的 C 程序。我已经包含了头文件并将 .dll 文件转换为 .lib 文件。
有趣的是,在windows上,gcc (CodeBlocks) 可以毫无问题地编译源代码。但在 Debian (Raspberry Pi) 下,我收到此错误消息:/usr/bin/ld: 找不到 -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;
}
希望有人能帮帮我...
在终端中发出这个
sudo apt-get install libsqlite3-dev
和 window lib 文件在 linux
中不起作用这里最基本的问题是你不能把一个二进制文件(一个程序, 您在一个操作系统(例如 Windows)上构建的对象文件、库)并期望 它可以在另一个操作系统上运行(例如 Linux)。二进制文件格式不同 操作系统之间。
Windows Debian 无法识别可执行文件和库。所以如果你
有一个使用 sqlite3
库的程序,你想在 Debian 上 运行,
你需要:
- 在 Debian 上编译源文件以创建 Linux 个目标文件。
- Link 带有
sqlite3
库的目标文件也已为 Linux. 构建
第二个问题是,即使 Linux sqlite3
库被调用 sqlite3.lib
(它不会是),即使 sqlite3.lib
在当前目录中
您尝试 link 您的程序,linker 选项 -lsqlite3.lib
将不会启用
linker 找到它(如您所见)。
offical behaviour of the GNU linker option -l
foo
是让 linker 在其库搜索路径中搜索给定目录
名为 libfoo.a(静态库)或 libfoo.so(动态库)的文件和
如果在同一目录中找到两者,则更喜欢 libfoo.so 。因此,-lsqlite3.lib
要求 linker 找到 libsqlite3.lib.so
或 libsqlite3.lib.a
,两者都不是
存在。
在 Windows 上,您会发现 -lsqlite3.lib
有效。那是因为 Windows
库不遵循 Linux 约定,即 foo 静态库
是 libfoo.a 而 foo 动态库是 libfoo.so。所以 Windows 端口
的 GNU linker 在 -l
选项中接受 Windows 风格的库名称,正如 所解释的
这里.
在 Debian 上,sqlite3
库的开发包可以从
包管理器为 libsqlite3-dev
。您可以以 root 身份使用以下命令安装它:
sudo apt-get install libsqlite3-dev
安装后,你可以编译你的程序,假设它是main.c
,使用命令:
gcc -Wall -c -o main.o main.c
Link它:
gcc -o prog main.o -lsqlite3
运行它:
$ ./prog
Database connection successful!
Table check successful!
Inserted tuple successful!