首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么我们在将curl库作为头文件包含之后还要链接它呢?

为什么我们在将curl库作为头文件包含之后还要链接它呢?
EN

Stack Overflow用户
提问于 2021-03-07 19:27:07
回答 3查看 39关注 0票数 0
代码语言:javascript
运行
复制
#include <curl/curl.h>

int main()
{
    CURL* curl = curl_easy_init();
    curl_easy_setopt(curl, CURLOPT_URL, "https://www.example.com")
    return 0;
}

编译时:

代码语言:javascript
运行
复制
gcc foo.c -lcurl

如果不包含curl库,为什么会返回此错误:

代码语言:javascript
运行
复制
/usr/bin/ld: /tmp/cclp7KeN.o: in function `main':
foo.c:(.text+0x157): undefined reference to `curl_easy_init'
/usr/bin/ld: foo.c:(.text+0x17f): undefined reference to `curl_easy_setopt'
collect2: error: ld returned 1 exit status

提前谢谢。

EN

回答 3

Stack Overflow用户

发布于 2021-03-07 19:29:51

您可以在定义(实现;已经为您编译的库)中包含声明(#定义、枚举、联合、结构、联合、类型定义和函数签名)。对于您在上面发布的代码,int main();将是声明,它是一个函数签名,不会按原样执行任何操作,而int main() { ... }是您的定义。

票数 2
EN

Stack Overflow用户

发布于 2021-03-07 19:54:35

在源文件中包含头文件将告诉编译器从何处获取curl库中函数和对象的声明。

在命令行中包含库文件将告诉链接器从何处获取包含curl库中函数和对象定义的对象模块。

( gcc命令本身不进行编译或链接。它调用其他可执行文件来执行这些和/或其他函数,它所做的取决于传递给它的开关和参数。)

票数 1
EN

Stack Overflow用户

发布于 2021-03-07 20:42:56

头文件只包含宏定义、类型定义和函数声明等内容-它不包含库的实际源代码。

该库的代码已经编译并打包成单独的二进制文件,可以静态链接到您的程序中,也可以在运行时加载(取决于您的需要)。

把头文件想象成定义库的接口--你仍然需要链接到它的实现上。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66515968

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档