Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 将头文件包括到静态库中_C_Gcc_Static Libraries_Header Files_Static Linking - Fatal编程技术网

C 将头文件包括到静态库中

C 将头文件包括到静态库中,c,gcc,static-libraries,header-files,static-linking,C,Gcc,Static Libraries,Header Files,Static Linking,因为每次我们链接静态库时,我们也需要包含头文件,我想知道在创建静态库时,是否可以将这些头文件归档到静态库中 假设我有两个由生成的对象文件foo1.o和foo2.o gcc foo1.c -I foo1.h -c -o foo1.o gcc foo2.c -I foo2.h -c -o foo2.o Gcc教程告诉我们可以使用 ar libfoo.a foo1.o foo2.o 这听起来一定很傻,但在存档时是否可以将这些头文件放在libfoo.a中?这样,当链接到libfoo.a时,人们不再

因为每次我们链接静态库时,我们也需要包含头文件,我想知道在创建静态库时,是否可以将这些头文件归档到静态库中

假设我有两个由生成的对象文件
foo1.o
foo2.o

gcc foo1.c -I foo1.h -c -o foo1.o
gcc foo2.c -I foo2.h -c -o foo2.o
Gcc教程告诉我们可以使用

ar libfoo.a foo1.o foo2.o 
这听起来一定很傻,但在存档时是否可以将这些头文件放在libfoo.a中?这样,当链接到
libfoo.a
时,人们不再需要花费数小时来查找和包含
foo1.h
foo2.h
,所以这样做似乎有一些好处,对吗


感谢您的想法。

首先,编译源代码时需要标题,而不是链接它。将对象与静态库链接不需要标题

第二,没有,没有标准或通用的方法来生成同时包含库和库头的归档文件。用普通的C编译器可能无法做到这一点

您可以在源代码中声明库的原型,然后忽略标题。但这是不安全的,因为不能保证库和源代码都是使用兼容原型编译的

下面是Paul Griffiths的评论。如果您不想为每个库都包含一个路径,那么应该安装这些头和库,并在您的环境中设置路径

例如:

export C_INCLUDE_PATH=$HOME/install/include
export LIBRARY_PATH=$HOME/install/lib

每次打开一个新shell时都必须导出它,或者您可以在
中定义它。bashrc

您可以将所有需要的内容编译到一个静态库中,但对应的是,您将无法从外部(即通过链接)调用函数,因为如果您想这样做,您总是需要他们的原型

可以将任何类型的文件放入存档,但是手动解包并将其从解包的地方包括进来似乎不是一个更好的解决方案。@Paul如果gcc人员有这样的设计,整个过程本可以自动化,Paul。问题是他们为什么没有这样做。应该有一个原因,一个很好的原因,gcc的人决定不节省人们查找头的时间,对吗?如果你正确安装了库,你就不必查找头。您只需将它包含在内,它就可以正常工作。这可能是因为您没有正确安装它。如果您正在安装一个通用库,您应该将头放在gcc将自动搜索的路径中,如
/usr/include
,或
/usr/local/include
,或一个
C\u include\u path
引用的自定义路径中。@zell:当然可以。设置
/home/zell/include/
或您想要的任何内容,将标题放在其中,并设置
C\u include\u PATH
以在登录脚本中指向它。你只需要正确地使用你的工具,而不是寻找次优的解决方案。这与安装库本身没有什么不同。但是我们确实需要找到头文件并在您想要链接到生成链接到foo.a的应用程序时使用“-I”,对吗?编译和链接是不同的事情。您需要标题,因为您在源文件中使用了
#include
语句。编译器利用头来发现库原型。编译完成后,需要将对象链接到库,现在使用的是链接器,而不是编译器。Gcc为您做两件事,但它仍然是两件不同的事情。