Kar*_*rus 3 c++ ubuntu makefile cmake static-libraries
我想制作一个简单的静态库,并从另一个项目链接到它。有三个源文件(全部在同一目录下),从该创建库: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,其中包含行#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
Run Code Online (Sandbox Code Playgroud)
所以它告诉我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 问题。
| 归档时间: |
|
| 查看次数: |
1104 次 |
| 最近记录: |