CURL 在 /usr/include 中,但仍然不会被 g++ 自动找到
CURL is in /usr/include but still won't automatically be found by g++
每次我想在我的一个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++中链接的工作方式。
-
当编译程序时,包含头文件
/usr/include/curl/curl.h
。编译器完成这部分工作。头文件包含库接口的所有定义。 -
当你链接程序时,你链接到库
/usr/lib/libcurl.so
,或者它的名字。链接器完成这部分工作。该库包含可加载(用于动态库)或可链接(用于静态库)格式的实现。
C和c++语言没有办法指定应该链接哪些库,所以你必须将-lcurl
传递给链接器。事情就是这样的。
有一些C和c++的扩展,允许你在源代码中编码库依赖,例如,#pragma comment
与MSC,但他们不支持典型的ELF工具链,据我所知。
注意:实际上,-lcurl
标志不是用于g++
,而是用于链接器ld
。当您将-lcurl
传递给g++
时,g++
将其传递给链接器
- 既然存在危险,为什么项目要使用-I include开关
- 有充分的理由在h文件中使用include保护而不是cpp文件吗
- 如何将更多文件夹添加到c++include路径
- 什么是"#include <boost/functional/hash.hpp> "?
- 对于MacOS上的G++,如何添加默认的include目录/usr/local/include和默认的库搜索路径/usr
- C++包含来自 #include "DevEngine/Core.h" 的错误
- <filesystem> 在 clang 6 和 10 上 #include 错误
- 在 void 函数中使用 #include 变量C++
- N-API include an .so or dll
- 允许哪些令牌作为 #include 的参数?
- GCC 包含标头(使用"-include")CMake 未检测到的更改
- WebAssembly include OpenCV
- 如何在 c++ 中正确指定 #include 路径以使程序可移植
- 修改生成文件以简化框架 #include 路径
- VS2015/VC++ 在新类模板中禁用默认 #include "stdafx.h"
- macOS 致命错误:sys/_types/_int8_t.h:没有此类文件或目录 #include < sys/_types/_int8_t.h>
- #include < conio.h> 和 getch() 方法之间的关系是什么?
- 如何将构建的C++库安装到 /usr/include?
- /usr/include/c++/7/cstdlib:75:15:致命错误:stdlib.h:没有这样的文件或目录 #i
- 解释通过 lex/flex 实现 C/C++嵌套的"#include "Header""语法?