加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

关于编译和库的两个基本问题

发布时间:2020-12-16 10:38:40 所属栏目:百科 来源:网络整理
导读:我有两个半相关的问题. 我的第一个问题:我可以调用标准库中的函数而不用编译整个库: #include stdio.h 我如何使用头文件做同样的事情?只是“包括”我的纯文本头文件显然不起作用. #include "nameofmyheader.h" 基本上,我如何创建其他文件可以调用的库?
我有两个半相关的问题.

我的第一个问题:我可以调用标准库中的函数而不用编译整个库:

#include <stdio.h>

我如何使用头文件做同样的事情?只是“包括”我的纯文本头文件显然不起作用.

#include "nameofmyheader.h"

基本上,我如何创建其他文件可以调用的库?

第二个问题:假设我有一个程序被分成50个c文件和一个头文件.除此之外,编译它的正确方法是什么:

cc main.c 1.h 1.c 2.c 3.c 4.c 5.c 6.c 7.c   /*... and so on*/

请纠正我的任何误解.我完全迷失在这里.

解决方法

首先,你对#include的情况感到有点困惑.你永远不会“编译”标准库.标准库已经编译好并且位于库文件中(Windows上的.dll和.lib文件,Linux上的.a和.so文件). #include的作用是为您提供链接到标准库所需的声明.

关于#include指令首先要理解的是它们是非常低级的.如果您使用Java或Python编程,则#includes与导入有很大不同. Imports在高级别告诉编译器“此源文件需要使用此包”,编译器会计算出如何解决该依赖关系. C指令中的#include说“获取此文件的全部内容,并在编译时直接将其粘贴到此处”.特别是,#include< stdio.h>引入一个文件,其中包含标准库中所有I / O函数的前向声明.然后,当您编译代码时,编译器知道如何调用这些函数并检查它们的类型正确性.

编译程序后,它将链接到标准库.这意味着您的链接器(由编译器自动调用)将导致您的可执行文件使用共享标准库(.dll或.so),或者将复制静态标准库所需的部分(.lib或.a)进入你的可执行文件.在任何情况下,您的可执行文件都“包含”您不使用的标准库的任何部分.

至于创建一个库,这是一个复杂的主题,我会把它留给其他人,特别是因为我不认为这是你真正想要做的事情,基于你的问题的下一部分.

头文件并不总是库的一部分.看来你拥有的是多个源文件,并且你希望能够在另一个源文件中使用来自一个源文件的函数.您可以在不创建库的情况下执行此操作.您需要做的就是将您希望从其他地方访问的foo.c的声明放入foo.h.声明是函数原型和“extern”变量声明之类的东西.例如,如果foo.c包含

int some_global;

void some_function(int a,char b)
 {
     /* Do some computation */
 }

然后为了使这些可以从其他源文件访问,foo.h需要包含

extern int some_global;

void some_function(int,char);

然后,只要你想使用some_global或some_function,你就可以#include“foo.h”.由于标题可以包含其他标题,因此通常将标题包装在“include guard”中,以便声明不会重复.例如,foo.h应该真正读取:

#ifndef FOO_H
#define FOO_H

extern int some_global;

void some_function(int,char);

#endif

这意味着每个编译单元(源文件)只会处理一次标题.

至于如何编译它们,永远不要把.h文件放在编译器命令行上,因为它们不应该包含任何可编译的代码(只有声明).在大多数情况下,编译为完全正常

cc main.c 1.c 2.c 3.c ... [etc]

但是,如果您有50个源文件,那么使用构建系统可能会更方便.在Linux上,这是一个Makefile.在Windows上,它取决于您使用的开发环境.您可以谷歌,或者在指定平台后提出另一个问题(因为这个问题已经相当广泛).

构建系统的一个优点是它们独立编译每个源文件,然后将它们全部链接在一起,这样当您只更改一个源文件时,只需要重新编译该文件(并重新链接程序)而不是重新编译所有内容,包括没有改变的东西.当程序变大时,这会产生很大的时间差异.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读