【问题标题】:Linking to a project cannot find header file链接到项目找不到头文件
【发布时间】:2015-10-02 05:03:56
【问题描述】:

我想制作一个简单的静态库,并从另一个项目链接到它。有三个源文件(都在同一目录中)可用于创建库:main1.cppheader1.hheader2.hmain1.cpp 包含#include "header1.h" 行,而header1.h 包含#include "header2.h" 行。为了创建这个库,我在我的CMakeLists.txt 文件中使用了add_library(foo STATIC main1.cpp)。运行cmake,然后运行make,会按预期创建文件libfoo.a

然后我有另一个项目,有一个文件main2.cpp,其中包含行#include "header1.h"。在该项目的CMakeLists.txt 文件中,我使用add_executable(bar main2.cpp)target_link_libraries(bar foo.a) 创建一个链接到我的静态库的可执行文件。然后我复制foo.aheader1.h 文件并将它们放在与此项目相同的目录中。

问题是,在编译第二个项目时,我收到以下错误:

header1.h: fatal error: header2.h: No such file or directory

所以它告诉我找不到header2.h,即使它在header1.h 中被引用。但是,我会认为foo.a 的内容会包含header2.h 的所有内容,当库构建时?当我想构建第二个项目时,我当然不应该包含第一个项目中的 所有 头文件吗?

谢谢:)

【问题讨论】:

  • 您确定需要cmake吗?对于简单的项目,我建议您自己编写Makefile(避免使用cmake,它会隐藏并增加复杂性)。你可能应该让你的图书馆成为一个共享的图书馆。今天,使用 static 库的原因很少(但其中一些是好的)。
  • 这真的是一个虚拟项目,只是为了让我可以学习创建库......在我看来,如果我没有正确完成这个简单的项目,那么我可能会遇到一些问题线!
  • " 我原以为 foo.a 的内容将包含 header2.h 的所有内容" - 库不包含标题。您的header1.h 包括header2.h。所述包含在预处理器步骤中失败,标头必须可用。
  • 但是您不需要cmake 来创建库。很多图书馆不使用它。 GNU make 用途广泛。

标签: c++ ubuntu cmake makefile static-libraries


【解决方案1】:

简短回答:您将需要所有公开您希望库导出的功能的头文件。换句话说,如果头文件包含仅在库中使用的函数,则无需公开这些头文件,除非您公开的某些头文件包含该头文件。

库包含的内容与头文件的功能之间似乎存在一些脱节。为简单起见,我们将头文件的用途限制为具有函数原型(稍后将删除此简化)。头文件的目的是告诉你的新代码(不是库的一部分)函数的外观,如它的名称、它的参数和它的返回类型。当你编译你的新应用程序时,如果它没有这些信息,它就不会知道如何处理诸如如何传递参数和如何处理返回值之类的事情。注意我没有包括头文件说明函数的作用,就像函数的机器代码一样。这就是图书馆所包含的。您需要这两个部分才能正确编译您的应用程序。

这可以扩展到您在头文件中找到的其他内容,例如结构。关键思想是您的应用程序仍然需要一些信息,例如函数原型和结构定义。

您还需要记住#include 的作用。它最简单的形式只是抓取指定文件的内容。所以如果一个头文件包含另一个头文件,第二个头文件的内容也会被抓取。

请注意,无论是静态库还是共享库,这都适用。


下一部分可能不是您想要做的,但它是未来访问者和您自己可能会发现有用的信息:

现在假设header1.h 包含您希望公开的功能,而header2.h 仅包含您希望成为内部的功能。然后,不要让header1.h 包含header2.h,而是应该将它们单独包含在源文件中,将它们包装在另一个可以包含的头文件中,或者如果依赖项允许,则让header2.h 包含header1.h。这样,您只需为您的图书馆用户发送header1.h。这并不是说他们不能使用header2.h 中的函数,因为它们仍然会被库公开,因为头文件无法控制这一点,但这会使使用它们变得更加困难。如果您想真正阻止库用户使用您不打算公开的功能,请查看此SO question

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-14
    • 2012-09-20
    相关资源
    最近更新 更多