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

时间:2016-04-08 19:41:26

标签: gcc c libraries

我正在尝试使用SQLite3编译一个小程序。我已经包含了Header-File并将.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;

}

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

2 个答案:

答案 0 :(得分:3)

在终端发布

sudo apt-get install libsqlite3-dev

和窗口lib文件在linux中不起作用

答案 1 :(得分:2)

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

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

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

第二个问题是,即使调用Linux sqlite3sqlite3.lib (它不会),即使sqlite3.lib在当前目录中 您尝试链接您的程序,链接器选项-lsqlite3.lib将无法启用 链接器找到它(正如你发现的那样)。

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

在Windows上,您会发现-lsqlite3.lib有效。那是因为Windows 库不符合 foo 静态库的Linux惯例 是 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!