
我的第一个问题:我可以调用标准库中的函数而不用编译整个库:
#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_Hextern int some_global;voID some_function(int,char);#endif
这意味着每个编译单元(源文件)只会处理一次标题.
至于如何编译它们,永远不要把.h文件放在编译器命令行上,因为它们不应该包含任何可编译的代码(只有声明).在大多数情况下,编译为完全正常
cc main.c 1.c 2.c 3.c ... [etc]
但是,如果您有50个源文件,那么使用构建系统可能会更方便.在linux上,这是一个Makefile.在windows上,它取决于您使用的开发环境.您可以谷歌,或者在指定平台后提出另一个问题(因为这个问题已经相当广泛).
构建系统的一个优点是它们独立编译每个源文件,然后将它们全部链接在一起,这样当您只更改一个源文件时,只需要重新编译该文件(并重新链接程序)而不是重新编译所有内容,包括没有改变的东西.当程序变大时,这会产生很大的时间差异.
@H_301_75@ 总结以上是内存溢出为你收集整理的关于编译和库的两个基本问题全部内容,希望文章能够帮你解决关于编译和库的两个基本问题所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)