2016-04-08 93 views
1

我想使用SQLite3来编译一个小小的C程序。我已经包含Header-File并将.dll文件转换为.lib文件。GCC编译错误:/ usr/bin/ld:找不到-lsqlite3.lib

有趣的是,在Windows上,gcc(CodeBlocks)可以毫无问题地编译源代码。但Debian的(树莓派)在我收到此错误信息:在/ usr /斌/劳工处:找不到-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; 

} 

我希望有人能帮助我...

+1

待办事项你有安装sqlite-devel软件包?在CentOS上,它叫做sqlite-devel.x86_64 –

+3

如果错误确实是'/ usr/bin/ld:找不到-lsqlite3.lib'我怀疑你的makefile有问题(linux静态库有一个.a扩展名) – fvu

+0

请将你的建立配方,makefile或其他任何东西,在这个问题中,请不要发表评论 –

回答

1

这里最根本的问题是,你不能把一个二进制文件(程序, 目标文件,库),你已经建立在一个操作系统上(例如, Windows)并且期望 它在另一个操作系统(例如Linux)上工作。操作系统之间的二进制文件格式不同 。

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

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

的第二个问题是,即使一台Linux sqlite3库被称为sqlite3.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 库不遵守Linux约定的FOO静态库 是libfoo.aFOO动态库是libfoo.so。因此,GNU链接器的Windows端口 接受-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! 
+0

非常感谢!它能够安装libsqlite3-dev包!下一次我想使用库,我会知道怎么做(无论.a或.so)。你们是伟大的! –

+0

@MichaelGierer欢迎来到Stackoverflow!如果这个答案已经解决了你的问题,你可以点击绿色复选标记[接受它](http://stackoverflow.com/help/accepted-answer)。这就是你说“谢谢”的方式。 –

2

这个问题在终端

sudo apt-get install libsqlite3-dev 

和窗口LIB文件没有在linux工作