我想创建一个简单的静态库,并从另一个项目链接到它。有三个源文件(全部在同一目录下),从该创建库:main1.cpp
,header1.h
,和header2.h
。main1.cpp
包含该行#include "header1.h"
,然后header1.h
包含该行#include "header2.h"
。要创建库,我add_library(foo STATIC main1.cpp)
在CMakeLists.txt
文件中使用。运行cmake
,然后按预期方式make
创建文件libfoo.a
。
然后,我有另一个项目main2.cpp
,其中包含一个文件,其中包含line #include "header1.h"
。在CMakeLists.txt
此项目的文件中,我使用add_executable(bar main2.cpp)
并target_link_libraries(bar foo.a)
创建一个链接到我的静态库的可执行文件。然后,我复制foo.a
和header1.h
文件,并将它们放置在与该项目相同的目录中。
问题是,在第二个项目的编译过程中,出现以下错误:
header1.h: fatal error: header2.h: No such file or directory
因此,它告诉我header2.h
即使在中被引用也找不到header1.h
。但是,我会认为的内容foo.a
将包含header2.h
库建立时的所有内容?当我要构建第二个项目时,当然不应该包含第一个项目的所有头文件吗?
谢谢 :)
简短的答案:您将需要所有标头文件,这些标头文件提供希望库导出的功能。换句话说,如果头文件包含仅在库中使用的函数,则无需公开那些头文件,除非您公开的某些头文件包括该头文件。
库包含的内容和头文件的内容之间似乎有些脱节。为简单起见,让我们将头文件的用途限制为具有函数原型(此简化将在以后删除)。头文件的目的是告诉您的新代码(不是库的一部分),该函数的外观,如名称,参数和返回类型。当您编译新应用程序时,如果它没有此信息,它将不知道如何处理诸如如何传递参数以及如何处理返回值之类的事情。注意我没有包括头文件中说明函数的功能,就像函数的机器代码中一样。这就是库包含的内容。您需要两个部分才能正确地编译您的应用程序。
这可以扩展到在头文件中找到的其他内容,例如结构。关键思想是您的应用程序仍需要一些信息,例如函数原型和结构定义。
另外,您还需要记住做什么#include
。它以最简单的形式获取指定文件的内容。因此,如果一个头文件包含另一个头文件,则第二个文件的内容也将被抓取。
请注意,无论它是静态库还是共享库都适用。
下一部分可能不是您要尝试做的,但它是将来的访问者和您自己可能会发现有用的信息:
现在说header1.h
包含您希望公开的功能,而header2.h
仅包含您希望内部的功能。然后,与其header1.h
将header2.h
它们包括在内,不应该将它们分别包含在源文件中,而是将它们包装在可以包含的另一个头文件中,或者在依赖项允许的情况下header2.h
包含header1.h
它们。这样,您只需要header1.h
为图书馆用户发货。这并不是说它们不能使用这些函数,header2.h
因为它们仍将由库公开,因为头文件无法控制它们,但是使用它们会稍微困难一些。如果要真正阻止库用户使用功能,则不打算公开此SO问题。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句