CMake:在整个项目的源文件中找不到头文件库文件,导致未定义的符号

nkoocmlb  于 7个月前  发布在  其他
关注(0)|答案(1)|浏览(169)

我有一个只包含头文件的库,叫做libA,在我的项目的一个名为libs的目录中。我在项目的另一个目录中有一个模块,叫做moduleA,它试图包含libA的头文件。moduleA中的文件试图#include“libA.h”,但显然无法找到它。当试图构建时,编译器详细说明有未定义的符号。
下面是我的项目的一个粗略的图表:

Project
|_libs
|   |_libA
|   |   |_include
|   |   |   |_libA.h
|   |   |_CMakeLists.txt
|
|_modules
|   |_moduleA
|   |   |_include
|   |   |   |_moduleA.h
|   |   |_src
|   |   |   |_moduleA.cpp
|   |   |_CMakeLists.txt

字符串
以下是我在libA的CMakeLists.txt中的内容:

add_library(libA INTERFACE)

target_include_directories(libA INTERFACE include)


以下是我在moduleA的CMakeLists.txt中的内容:

add_library(moduleA
    STATIC
    src/moduleA.cpp
)

target_link_libraries(moduleA PUBLIC libA compile_flags)

target_include_directories(moduleA PUBLIC include)


我认为链接libA会使libA. h对其他模块可用,但似乎并非如此。

ulydmbyx

ulydmbyx1#

正如您所提到的,CMake将仅头文件库实现为接口库,根据CMake关于add_library的文档,该接口库被设计为不编译源代码或生成任何构建工件。
基本上,当一个目标包含一个接口库目标时,它只是指定了它的头文件的包含路径。因此,在你的例子中,你会发现在<libA.h>你的moduleA项目的源文件中添加“#include“将工作,因为构建系统现在能够找到它们。
回到你的问题,如果你的项目在构建moduleA时抛出undefined symbols错误,这意味着它编译得很好,但在链接阶段失败了。考虑到这一点,你可能会遇到以下两个问题之一:

  • 要么你的moduleA项目声明了符号,但没有定义它们,这会导致符号丢失,要么
  • 你的libA项目实际上不是一个只有头的库,也不是它的包含路径中缺少的符号声明。

要解决此问题,请检查错误消息以找到丢失的符号,并检查为什么它们在开始时丢失。这些符号来自moduleA或libA,一旦您确定它们来自何处,那么只需找出为什么您的项目遗漏它们。

相关问题