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

ove*_*cyn 3 c

我有两个半相关的问题.

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

#include <stdio.h>
Run Code Online (Sandbox Code Playgroud)

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

#include "nameofmyheader.h"
Run Code Online (Sandbox Code Playgroud)

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

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

cc main.c 1.h 1.c 2.c 3.c 4.c 5.c 6.c 7.c   /*... and so on*/
Run Code Online (Sandbox Code Playgroud)

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

Tyl*_*nry 14

首先,你对#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 */
 }
Run Code Online (Sandbox Code Playgroud)

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

extern int some_global;

void some_function(int, char);
Run Code Online (Sandbox Code Playgroud)

然后,#include "foo.h"无论你想在哪里使用some_global或some_function.由于标头可以包含其他标头,因此通常将标头包装在"包含保护"中,以便声明不会重复.例如,foo.h应该真正读取:

#ifndef FOO_H
#define FOO_H

extern int some_global;

void some_function(int, char);

#endif
Run Code Online (Sandbox Code Playgroud)

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

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

cc main.c 1.c 2.c 3.c ... [etc]
Run Code Online (Sandbox Code Playgroud)

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

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