在 CLion 中,header 只有库:文件 "does not belong to any project target, code insight features might not work properly"

In CLion, header only library: file "does not belong to any project target, code insight features might not work properly"

我有一个使用 cmake 命令设置的 header-only 库项目:

add_library(my_library INTERFACE)

我还添加了

target_sources(my_library INTERFACE ${MY_LIRBARY_HEADER_FILES})

但是当我打开源文件时,我收到警告:

This file does not belong to any project target, code insight features might not work properly

我失去了很多功能,比如代码完成。

正确的设置方法是什么,以便 CLion 在 header-only 库上提供其通常的功能?

Clion 从 CMake 构建系统获取有关源文件的信息。当您将任何 cpp 文件添加到源列表时,CMake 会自动告知 header 同名。因此,如果 cpp/h 名称不同(或者您根本没有 cpp 文件),您应该手动包含 header。

set(Sources my_lib.cpp)
set(Headers header_of_my_lib.h)
add_executable(superlib ${Sources} ${Headers})

如果您没有任何可执行文件,您可以省略最后一行,CLion 仍会识别文件

您可以像这样将头文件添加到您的项目中:

set(SOURCE_FILES main.cpp MyClass1.cpp MyClass1.h MyClass2.cpp MyClass2.h)

您也可以像这样分多个步骤进行设置:

set(SOURCE_FILES main.cpp)
set(SOURCE_FILES ${SOURCE_FILES} MyClass1.cpp MyClass1.h)
set(SOURCE_FILES ${SOURCE_FILES} MyClass2.cpp MyClass2.h)

尽管如评论中所述,您可能根本不应该将头文件添加到您的项目中。

背景不多

我遇到了同样的问题,虽然项目不是 header-only,但是,来自 inc 文件夹的打开文件会抛出上述警告,即使 CMake 文件清楚地标记了该文件夹成为 include_directory.

*.hpp 文件不属于 ${SOURCE}

include_directories("${PROJECT_SOURCE_DIR}/inc/")
add_subdirectory(src)
add_executable(${EXECUTABLE_NAME} main.cpp ${SOURCE})

由于这是一个完全有效的 CMake 文件并且将包含文件添加到源文件不是惯用的,所以我不想修改 CMake 文件。

解决方案

如官方JetBrains Forum所述,CMake文件确实有效,显示警告是因为CLion无法正确索引header文件。从 link 中提取的建议解决方法是 right-click 文件夹和 Mark directory as | Library Files/Project Sources and Headers.

So, this header isn't includes in executables and CLion notifies you that some code insight features might not work properly. As workaround you can use "Mark directory as" Library Files/Project Source and Headers for folder.

此警告是一个 IDE 问题,即 Android Studio 无法识别当前目录 如果它不包含任何源文件

解决方法

添加一个空源文件,例如 empty_xxx.c 在有问题的目录 下,并在相应的 CMakeList.txt

中添加以下行
add_library(${TARGET_NAME_XXX} SHARED ${SOME_DIR_HAVING_THIS_WARNING}/empty_xxx.c)

将有助于消除此警告。