在CLion中,头文件库:"不属于任何项目目标,代码洞察功能可能无法正常工作"

94

我有一个只包含头文件的库项目,使用cmake命令进行设置:

add_library(my_library INTERFACE)

我还添加了

target_sources(my_library INTERFACE ${MY_LIRBARY_HEADER_FILES})

但是当我打开一个源文件时,会收到以下警告:

此文件不属于任何项目目标,代码洞察功能可能无法正常工作

我失去了很多功能,比如代码自动补全。

应该如何设置才能使CLion在仅有头文件的库上提供其通常的功能?

5个回答

141

背景

我遇到了同样的问题,尽管该项目不是仅由头文件组成,但是从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论坛所述,CMake文件确实有效,警告是由于CLion无法正确索引头文件而显示的。从链接中提取的建议性解决方案是:右键单击文件夹并选择标记目录为|库文件/项目源和头文件

因此,这个头文件没有被包含在可执行文件中,CLion会通知你一些代码提示功能可能无法正常工作。可以使用“标记目录为”库文件/项目源和头文件的文件夹来解决问题。


1
如果您不介意放弃使用Clion构建的能力,那么您可以做得更好(我很高兴在命令行上构建,并在clion中进行适当的索引)。CLion为cmake提供了一个CLION_IDE环境变量,因此您可以将头文件添加到源数组if ($ENV{CLION_IDE})中,从而使clion正确地索引所有内容(但会破坏您实际使用Clion集成构建的能力)。 - Chris Kitching
1
值得注意的是:“标记为项目源”将无法正确处理包含目录等内容。 - Chris Kitching
1
但是,如果您在使用命令行时在CMake文件中有CLion特定的内容,那么此时您可能会完全放弃CMake文件并只使用Makefile或在命令行上执行所有操作。此外,我从未遇到过在使用“将目录标记为项目源和头文件”时出现不当行为的情况。您具体遇到了什么问题? - sjaustirni
@ChrisKitching 我在做这件事时没有遇到过这个缺点。你能确认你仍然有这个问题并且发表另一条评论提供更多细节或删除之前的评论吗? - xaxxon
@xaxxon 您指的是哪一个缺陷?“标记为源”无法处理包含目录吗?我的第一条评论是“破坏构建”吗?现在有些事情已经改变了:CMake现在正确地忽略了源数组中的头文件(也许可以编辑答案)。 “标记为源”尝试猜测将这些源逻辑上“附加”到哪个目标,以便于clion的索引。对于除非非常简单的项目,这通常会失败,导致索引失败。然而它现在已经不再重要,因为您现在可以将所有东西都倒入CMake目标源代码中,它将正确地工作。 - Chris Kitching
4
这在CLion 2022.2.4中不起作用,你提到的选项甚至不存在。 - HII

4

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

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

如果您没有可执行文件,可以省略最后一行。CLion仍然会知道这些文件。

9
请停止将头文件添加到可执行文件中。这个 JetBrains 的 bug 的正确解决方法已经在我的答案中描述过了。 - sjaustirni
2
@sjaustirni CMake不会混淆。有人争论过(Bahadir,Meeting C++ 2019)头文件应该始终包含在可执行文件中。如果没有其他问题,这意味着当用户的IDE查询CMake源文件时,它会得到正确的答案。 - c z
@cz 我承认我没有看过这个讲座,但你不需要将头文件包含到可执行文件中,就可以让你的IDE理解你的代码库并获得Intellisense。如果你看一下我对这个问题的回答,你就可以看到如何在不污染CMake目标的情况下完成它。 - sjaustirni
1
@sjaustirni 大约在9分钟处。开发人员的论点是头文件应该在CMake文件中,因为这样每个人都知道头文件属于哪个项目。他们还说这些头文件不是必需的,CMake可以在有或没有它们的情况下工作,但如果存在,IDE应该利用它们。 - c z
@c z 很好的观点。这似乎是一个不错的功能,谢谢。我的回答和第一条评论实际上早于这次讨论(显然,也早于这个功能本身),所以当时我不可能知道它的存在。我会看看是否有时间更新我的回答 :) - sjaustirni

1

在我的情况下,我的项目是一个Makefile项目。我重命名了一个.c文件,然后CLion告诉我这个文件不属于任何项目。原因是索引不是最新的。在我执行了“清除并重新加载Makefile项目”之后,消息自动消失了。

步骤如下:

  1. 从主菜单->视图->工具窗口->构建中打开构建工具窗口
  2. 点击“清除并重新加载Makefile项目”enter image description here

完成。


-1

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

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)

虽然在评论中提到过,但你可能根本不应该将头文件添加到你的项目中。


1
在CMake中,SOURCE_FILES是一种神奇的变量吗?我没有看到任何相关文档。 - xaxxon
这里提到了:[https://www.jetbrains.com/help/clion/quick-cmake-tutorial.html]。 - Azurespot
也许如果将 SOURCE_FILES 作为源文件列表添加到目标中,它会执行某些操作,但是如果没有这样做,我没有看到任何关于它本身对所问问题的解决方案有任何帮助。 - xaxxon
好的,谢谢。我只是通过试错传递信息。当我尝试将上述内容列在多行中时,它无法工作。据我所知,当您创建项目时,SOURCE_FILES是由CLion自动生成的。可能不在每个人的CMake中。我遇到了与您相同的错误,所以这可能会帮助其他人。 - Azurespot
4
这不是仅仅“我感觉是这样”的事情。这是一个非常明确的“你做错了,现在你正在分享错误信息”的事情。你的回答是错误的,应该被删除,因为其他人可能会相信你。 - xaxxon
显示剩余5条评论

-1

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

解决方法

在相关目录下添加一个空的源文件,例如empty_xxx.c,并在相应的CMakeList.txt中添加以下行:

add_library(${TARGET_NAME_XXX} SHARED ${SOME_DIR_HAVING_THIS_WARNING}/empty_xxx.c)

将有助于消除此警告。


你尝试过被接受的答案了吗?它没起作用吗?你不应该需要为此使用cmake变通方法。 - xaxxon
2
更具体地说,我看不到选项 标记目录为 | 库文件/项目源和头文件 - shizhen
3
很可能是因为这个问题涉及到CLion。 - xaxxon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接