我有一个只包含头文件的库,叫做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对其他模块可用,但似乎并非如此。
1条答案
按热度按时间ulydmbyx1#
正如您所提到的,CMake将仅头文件库实现为接口库,根据CMake关于
add_library
的文档,该接口库被设计为不编译源代码或生成任何构建工件。基本上,当一个目标包含一个接口库目标时,它只是指定了它的头文件的包含路径。因此,在你的例子中,你会发现在<libA.h>你的moduleA项目的源文件中添加“#include“将工作,因为构建系统现在能够找到它们。
回到你的问题,如果你的项目在构建moduleA时抛出undefined symbols错误,这意味着它编译得很好,但在链接阶段失败了。考虑到这一点,你可能会遇到以下两个问题之一:
要解决此问题,请检查错误消息以找到丢失的符号,并检查为什么它们在开始时丢失。这些符号来自moduleA或libA,一旦您确定它们来自何处,那么只需找出为什么您的项目遗漏它们。