【发布时间】:2015-10-02 05:03:56
【问题描述】:
我想制作一个简单的静态库,并从另一个项目链接到它。有三个源文件(都在同一目录中)可用于创建库:main1.cpp、header1.h 和 header2.h。 main1.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.a 和header1.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来创建库。很多图书馆不使用它。 GNUmake用途广泛。
标签: c++ ubuntu cmake makefile static-libraries