CURL 在 /usr/include 中,但仍然不会被 g++ 自动找到

CURL is in /usr/include but still won't automatically be found by g++

本文关键字:g++ include usr CURL      更新时间:2023-10-16

每次我想在我的一个c++程序中使用CURL时,我必须将标志-lcurl作为标志添加到g++上。在使用Eclipse时,这尤其令人讨厌。如果/usr/include/curl/curl.h存在,我需要做些什么来让CURL始终在g++的包含路径内?

tl;dr:您必须添加标志。


链接器需要libcurl而不是编译器。编译器需要头文件;链接器需要库。

为了简化一些事情,头文件告诉编译器这些声明将在以后定义。Libcurl是真正定义它们的。

链接器不会猜测和检查要链接的对象(这样做将是一个可怕的想法)。您必须显式地告诉它要链接什么(默认库除外)。特别是,链接器必须知道如何使用libcurl来查找curl.h列出的声明。如果没有libcurl,链接器将缺少函数,因此无法生成完整的二进制文件。

我不熟悉Eclipse,但我几乎可以肯定它有一个选项,您可以在其中指定额外的库。是的,每个项目你必须这样做一次,但这不应该是主要的开销。

尝试在

中添加curl路径

属性-> C/c++通用->路径和符号:

这就是C和c++中链接的工作方式。

  1. 编译程序时,包含头文件/usr/include/curl/curl.h。编译器完成这部分工作。头文件包含库接口的所有定义。

  2. 当你链接程序时,你链接到库/usr/lib/libcurl.so,或者它的名字。链接器完成这部分工作。该库包含可加载(用于动态库)或可链接(用于静态库)格式的实现。

C和c++语言没有办法指定应该链接哪些库,所以你必须将-lcurl传递给链接器。事情就是这样的。

有一些C和c++的扩展,允许你在源代码中编码库依赖,例如,#pragma comment与MSC,但他们不支持典型的ELF工具链,据我所知。

注意:实际上,-lcurl标志不是用于g++,而是用于链接器ld。当您将-lcurl传递给g++时,g++将其传递给链接器