如何 link 一个 SQLite c 文件(Amalgamation)与 cpp 应用程序?
How to link a SQLite c file (the Amalgamation) with cpp application?
我想在嵌入式 Linux 上构建此过程,而不安装 sqlite3 或 sqlite3-dev(我已经尝试安装它们并且成功了)。
我在目录中有 4 个文件:main.cpp sqlite3.c sqlite3.h example.db
我以这种方式将 sqlite3.h 包含在 main.cpp 中:
extern "C"{
#include "sqlite3.h"
}
然后我输入了这些命令:
gcc -c sqlite3.c -o sqlite3.o
g++ -c main.cpp -o main.o
已经到此为止了,所以我写了这个
g++ -o main.out main.o -L.
但我遇到了这些错误
main.o: In function `main':
main.cpp:(.text+0xf6): undefined reference to `sqlite3_open'
main.cpp:(.text+0x16d): undefined reference to `sqlite3_exec'
main.cpp:(.text+0x1c6): undefined reference to `sqlite3_exec'
main.cpp:(.text+0x1f7): undefined reference to `sqlite3_free'
main.cpp:(.text+0x25c): undefined reference to `sqlite3_exec'
main.cpp:(.text+0x299): undefined reference to `sqlite3_exec'
main.cpp:(.text+0x2ca): undefined reference to `sqlite3_free'
main.cpp:(.text+0x32f): undefined reference to `sqlite3_exec'
main.cpp:(.text+0x33b): undefined reference to `sqlite3_close'
collect2: error: ld returned 1 exit status
如何静态link那些文件?
您实际上并没有link使用 SQLite 对象文件 sqlite3.o
。
linker 不知道没有明确指定的文件或库,所以你需要做,例如
g++ -o main.out main.o sqlite3.o
考虑到您遇到的其他错误,您需要使用 -pthread
选项进行构建,无论是在编译 还是 时 linking.
而-L
选项是添加一个库搜索你用-l
(小写L)选项命名的库的路径。 linker 将不会 自动搜索任何库或目标文件。你真的需要在 linking.
时明确指定它们
总而言之,构建如下:
g++ -Wall -pthread main.cpp -c
gcc -Wall -pthread sqlite3.c -c
g++ -pthread -o main.out main.o sqlite3.o -ldl
请注意,我们现在还 link 使用 dl
库,如 Shawn link 编辑的文档中所述。
我想在嵌入式 Linux 上构建此过程,而不安装 sqlite3 或 sqlite3-dev(我已经尝试安装它们并且成功了)。
我在目录中有 4 个文件:main.cpp sqlite3.c sqlite3.h example.db
我以这种方式将 sqlite3.h 包含在 main.cpp 中:
extern "C"{
#include "sqlite3.h"
}
然后我输入了这些命令:
gcc -c sqlite3.c -o sqlite3.o
g++ -c main.cpp -o main.o
已经到此为止了,所以我写了这个
g++ -o main.out main.o -L.
但我遇到了这些错误
main.o: In function `main':
main.cpp:(.text+0xf6): undefined reference to `sqlite3_open'
main.cpp:(.text+0x16d): undefined reference to `sqlite3_exec'
main.cpp:(.text+0x1c6): undefined reference to `sqlite3_exec'
main.cpp:(.text+0x1f7): undefined reference to `sqlite3_free'
main.cpp:(.text+0x25c): undefined reference to `sqlite3_exec'
main.cpp:(.text+0x299): undefined reference to `sqlite3_exec'
main.cpp:(.text+0x2ca): undefined reference to `sqlite3_free'
main.cpp:(.text+0x32f): undefined reference to `sqlite3_exec'
main.cpp:(.text+0x33b): undefined reference to `sqlite3_close'
collect2: error: ld returned 1 exit status
如何静态link那些文件?
您实际上并没有link使用 SQLite 对象文件 sqlite3.o
。
linker 不知道没有明确指定的文件或库,所以你需要做,例如
g++ -o main.out main.o sqlite3.o
考虑到您遇到的其他错误,您需要使用 -pthread
选项进行构建,无论是在编译 还是 时 linking.
而-L
选项是添加一个库搜索你用-l
(小写L)选项命名的库的路径。 linker 将不会 自动搜索任何库或目标文件。你真的需要在 linking.
总而言之,构建如下:
g++ -Wall -pthread main.cpp -c
gcc -Wall -pthread sqlite3.c -c
g++ -pthread -o main.out main.o sqlite3.o -ldl
请注意,我们现在还 link 使用 dl
库,如 Shawn link 编辑的文档中所述。