0

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

4

3 回答 3

1

tl;博士:你必须添加标志。


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

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

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

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

于 2013-01-09T04:28:00.117 回答
1

尝试添加卷曲路径

属性 -> C/C++ 常规 -> 路径和符号:

于 2013-01-09T04:31:32.027 回答
1

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

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

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

C 和 C++ 语言无法指定应该链接哪些库,因此您必须将其传递-lcurl给链接器。这就是它的方式。

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

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

于 2013-01-09T04:33:34.133 回答