我想使用 libcurl(一个处理 HTTP 连接的库),将其静态链接到我正在编写的程序。我刚开始从源代码构建程序,所以我不知道该怎么做(我想避免安装libcurl,这样就不会干扰我的系统)。
就是这样。我下载了 libcurl来源,然后我用 构建了它们./configure && make && make test
。好吧,我想我已经构建了它们,因为测试通过了。而且我实际上下载了整个 curl 软件的源代码,所以我想我构建的不仅仅是 libcurl 库。
现在,我写的是mysource.c
:
#include <stdio.h>
#include <curl/curl.h>
int main(void) {
CURL *curl;
curl = curl_easy_init();
if(curl) {
// do something
}
return 0;
}
因此,我将include
curl 源中的所有文件夹移到 附近mysource.c
,以便预处理器解析#include <curl/curl.h>
。我想我还应该带上二进制构建库(如???libcurl.o
其他东西?)。但我在 curl 文件夹/子文件夹中找不到任何具有此类名称的文件。它在哪里? 即使我找到它并将它带到我自己的源中,使用是否有效?那么 gcc 如何能够理解 -lcurl 标志?libcurl.so
libcurl.a
gcc -static -I... -L... -lcurl mysource.c
更一般地(以下问题应该适用于所有源,而不仅仅是 curl/libcurl),当从源构建时,编译和链接的二进制文件去哪里了?我知道我应该通过阅读得到答案makefile
,但它有数千行长,而且我真的没有在任何地方看到构建的二进制文件的输出目录。
我知道,如果我make install
也运行,我应该在某个地方找到它们,例如/usr/local/bin
,/usr/local/lib
(以及相应的 .h 文件,如果有的话,在/usr/local/include
)。但是如果我不想安装刚刚构建的软件会发生什么?我不能只抓取编译的文件来使用它们吗?
多谢
答案1
其思想是编译器将 .c 文件转换为 .o,即所谓的目标文件。接下来,编译器ar
将创建一个库,即 .a 文件,该文件应该包含几个可以重复使用的编译后的 C 函数。最后,ld
执行链接,从指定的 .o 和 .a 文件创建 .so 或 ELF。由于这种不必要的复杂性,大多数编译器也是 ld 和 ar bintools 的前端。
要覆盖编译器/链接器搜索库的路径,可以使用 --library-path=searchdir 选项。虽然我只是在回答问题,但对于静态链接的 ELF,您实际上并不需要 .a 文件。
那么,您需要链接哪个模块 (.o 文件) 才能使用特定功能?通常,您应该搜索哪个 .c 文件包含它,默认情况下,xyz.c 文件会编译成 xyz.o,因此您需要这个。