关于编译和库的两个基本问题
我有两个半相关的问题.
我的第一个问题:我可以调用标准库中的函数而不用编译整个库: #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上,它取决于您使用的开发环境.您可以谷歌,或者在指定平台后提出另一个问题(因为这个问题已经相当广泛). 构建系统的一个优点是它们独立编译每个源文件,然后将它们全部链接在一起,这样当您只更改一个源文件时,只需要重新编译该文件(并重新链接程序)而不是重新编译所有内容,包括没有改变的东西.当程序变大时,这会产生很大的时间差异. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |