GCC编译错误:/usr/bin/ld: 找不到-lsqlite3.lib。

9
我正在尝试使用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;

}

I hope someone can help me ...


2
你是否安装了sqlite-devel包?在CentOS中,它被称为sqlite-devel.x86_64。 - Tim S.
3
如果错误确实是 /usr/bin/ld: cannot find -lsqlite3.lib,我怀疑您的 makefile 存在问题(Linux 静态库的扩展名为 .a)。 - fvu
请在问题中发布您的构建配方、Makefile或其他内容,而不是在评论中。 - Faheem Mitha
1
在Debian Jessie上,您需要安装libsqlite3-dev - Faheem Mitha
1
如果你试图在Linux上将Windows的.lib文件与你的代码链接起来,那么这是预期的结果。你需要为OS/CPU编译SQLite。因此,你需要三个不同的SQLite实例,分别为Windows + x86、Linux + x86和Linux + arm。 - fghj
2个回答

14
这里最基本的问题是,你不能将在一个操作系统(例如Windows)上构建的二进制文件(程序、目标文件、库)直接应用于另一个操作系统(例如Linux),因为不同操作系统有不同的二进制文件格式。
Debian无法识别Windows可执行文件和库。因此,如果你想在Debian上运行使用sqlite3库的程序,你需要:
- 在Debian上编译源文件以创建Linux目标文件。 - 将目标文件与也已针对Linux构建的sqlite3库进行链接。
次要问题是,即使Linux的sqlite3库被称为sqlite3.lib(实际上不会),并且甚至在尝试链接程序时sqlite3.lib位于当前目录中,链接器选项-lsqlite3.lib仍无法使链接器找到它(正如你所发现的)。

GNU链接器选项-lfoo的官方行为是使链接器在其库搜索路径中搜索给定目录,寻找名为libfoo.a(静态库)或libfoo.so(动态库)的文件,并且如果在同一目录中同时找到libfoo.solibfoo.a,则优先选择libfoo.so。因此,-lsqlite3.lib要求链接器查找libsqlite3.lib.solibsqlite3.lib.a,但两者都不存在。

在Windows上,你会发现-lsqlite3.lib可以正常工作。这是因为Windows库不遵循Linux惯例,即foo静态库为libfoo.a,而foo动态库则为libfoo.so。因此,GNU链接器的Windows版本接受Windows样式的库名称作为-l选项,如这里所解释的那样。 在Debian上,sqlite3库的开发者包可从软件包管理器中以libsqlite3-dev的形式获得。您可以使用以下命令以root身份安装它:
sudo apt-get install libsqlite3-dev

安装完成后,您可以使用以下命令编译您的程序(假设您要编译的文件名为main.c):
gcc -Wall -c -o main.o main.c

链接它:

gcc -o prog main.o -lsqlite3

运行它:

$ ./prog
Database connection successful!
Table check successful!
Inserted tuple successful!

非常感谢!安装了libsqlite3-dev包后,它起作用了!下次我想使用库时,我会知道如何做(无论是.a还是.so)。你们太棒了! - Michael Gierer
@MichaelGierer 欢迎来到Stackoverflow!如果这个答案解决了您的问题,您可以通过点击绿色的勾号接受它。这就是您表达“感谢”的方式。 - Mike Kinghan

8
在终端中输入此命令。
sudo apt-get install libsqlite3-dev

窗口库文件在Linux中无法使用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接