GCC 编译错误 :/usr/bin/ld: cannot find -lsqlite3. lib

标签 gcc c libraries

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

}

我希望有一个人可以帮助我 ...

最佳答案

这里最基本的问题是你不能把二进制文件(一个程序,
您在一个操作系统(例如 Windows)上构建的目标文件、库)并期望
它适用于另一个操作系统(例如 Linux)。二进制文件格式不同
操作系统之间。

Debian 无法识别 Windows 可执行文件和库。所以如果你
有一个使用 sqlite3 库的程序,你想在 Debian 上运行,
你需要:

  • 在 Debian 上编译源文件以创建 Linux 目标文件。
  • 将目标文件与同样为 Linux 构建的 sqlite3 库链接。

  • 第二个问题是,即使 Linux sqlite3 库被称为 sqlite3.lib(它不会是),即使 sqlite3.lib 在当前目录中
    你试图链接你的程序,链接器选项 -lsqlite3.lib 将不会启用
    找到它的链接器(如您所见)。

    offical behaviour of the GNU linker option -l foo
    是让链接器在其库搜索路径中搜索给定目录
    一个名为 libfoo.a(静态库)或 libfoo.so(动态库)的文件和
    如果在同一目录中找到两者,则更喜欢 libfoo.so。因此,-lsqlite3.lib要求链接器找到libsqlite3.lib.solibsqlite3.lib.a,都不是
    哪个存在。

    在 Windows 上,您会发现 -lsqlite3.lib 有效。那是因为 Windows
    库不遵循Linux约定,即foo静态库
    是 libfoo.a,而 foo 动态库是 libfoo.so。所以Windows端口
    GNU 链接器的 -l 选项接受 Windows 风格的库名称,如 explained here

    在 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!
    

    关于GCC 编译错误 :/usr/bin/ld: cannot find -lsqlite3. lib,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36512336/

    相关文章:

    在 Windows 7 上用 GCC 编译 :\mingw32\bin\ld. exe : cannot open output file a. exe

    c - 是什么让 C 标准库函数变得危险,还有什么替代方案?

    c - 了解阶乘函数分配

    c++ - 无法编译。头文件。封闭自己的对象定义

    c# - 用于创建具有合并功能的电子邮件模板的好库

    c++ - `import` 和 `#include` 之间的区别? cpp20

    c++ - gcc 版本显示 4.2.1 即使在安装 4.9 (Homebrew) 之后

    c++ - 哪种算法最适合具有索引分组的非连续数组?

    CMAKE 没有为内部共享库制定目标的规则

    c++ - -fPIC 仅适用于共享库吗?