C++ 在CLion中,仅标题库:file";不属于任何项目目标,code insight功能可能无法正常工作;

C++ 在CLion中,仅标题库:file";不属于任何项目目标,code insight功能可能无法正常工作;,c++,cmake,clion,header-only,C++,Cmake,Clion,Header Only,我使用cmake命令设置了一个仅标题的库项目: add_library(my_library INTERFACE) 我还补充说 target_sources(my_library INTERFACE ${MY_LIRBARY_HEADER_FILES}) 但是当我打开一个源文件时,我得到了警告: 此文件不属于任何项目目标,code insight功能可能无法正常工作 我失去了很多功能,比如代码完成 设置此功能的正确方法是什么,以便CLion在仅标题的库中提供其常用功能?CLion从CMake

我使用cmake命令设置了一个仅标题的库项目:

add_library(my_library INTERFACE)
我还补充说

target_sources(my_library INTERFACE ${MY_LIRBARY_HEADER_FILES})
但是当我打开一个源文件时,我得到了警告:

此文件不属于任何项目目标,code insight功能可能无法正常工作

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


设置此功能的正确方法是什么,以便CLion在仅标题的库中提供其常用功能?

CLion从CMake build system获取有关源文件的信息。当您将任何cpp文件添加到源列表中时,CMake会自动告知具有相同名称的标题。所以,如果cpp/h名称不同(或者您根本没有cpp文件),您应该手动包含标题

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)
尽管如评论中所述,您可能根本不应该将头文件添加到项目中。

Little background 我也遇到了同样的问题,尽管项目不仅仅是标题,但是,
inc
文件夹中打开的文件抛出了上述警告,即使CMake文件清楚地将该文件夹标记为
include\u目录

*.hpp文件不属于${SOURCE} 由于这是一个完全有效的CMake文件,并且将include文件添加到源文件并不惯用,因此我不想修改CMake文件

解决方案 正如官方网站上所描述的,CMake文件确实有效,并且由于CLion无法正确索引头文件而显示警告。从链接中提取的建议解决方法是右键单击文件夹并将目录标记为|
库文件
/
项目源和标题

因此,此标头不包含在可执行文件中,CLion会通知您某些code insight功能可能无法正常工作。作为解决方法,您可以使用“将目录标记为”库文件/项目源和文件夹的标题


源文件是cmake中的一个神奇变量吗?我没有看到关于它的任何文档。有人提到过。这并不意味着从cmake的角度来看,SOURCE_文件是一个重要的变量。也许如果SOURCE_文件作为源列表添加到目标中,它会做一些事情,但如果没有它,我就看不到任何单独的说明,对被问到的问题做任何事情。这不是一种“我觉得这样”的事情。这是一种非常明显的“你做错了,现在你在分享坏信息”之类的事情。您的答案不正确,应该删除,因为其他人可能会相信您。请停止向可执行文件添加头文件。我的回答中描述了这个JetBrains bug的正确解决方法。@Sjoustirni CMake不会感到困惑。有人认为()头文件应该始终包含在可执行文件中。如果没有其他内容,这意味着用户的IDE在查询CMake源文件时得到了正确的答案。@cz我承认没有看过这个演讲,但为了让IDE理解代码库并获得Intellisense,您不需要将头文件包含到可执行文件中。如果你看看我对这个问题的回答,你会发现如何做到这一点,而不会用头文件污染你的CMake目标。如果你不介意牺牲使用Clion构建的能力,你可以做得更好(我很高兴在命令行上构建,并且在Clion中有适当的索引)。CLion为cmake提供了一个
CLion\u IDE
环境变量,因此您可以将头文件添加到源代码数组
if($ENV{CLion\u IDE})
,使CLion正确索引所有内容(但破坏了您实际使用CLion的集成构建的能力。特别是:“标记为项目源代码”将无法正确处理诸如包含目录之类的内容。@ChrisKitching,但无论如何,在使用命令行时,您的CMake文件中有CLion特定的内容。此时,您最好完全放弃CMake文件,只使用Makefile或在命令行上执行所有操作。此外,我在使用 将目录标记为项目源和标题。您到底有什么问题?@ChrisKitching我在执行此操作时没有遇到此缺点。您是否可以验证您仍然存在此问题,然后发布另一条更详细的评论或删除您以前的评论?@xaxxon您到底有哪些缺点提到“标记为源”不处理include dirs?我的第一个评论“破坏构建”?现在有些事情已经改变:CMake现在正确地忽略源数组中的头(可能是编辑答案)。“标记为源”尝试猜测逻辑上“附加”哪个目标这些源代码用于clion的索引。除了非常简单的项目外,这通常都会失败,导致索引失败。但是,这现在是没有意义的,因为您现在可以转储CMake目标源中的所有内容,并且它将正常工作。
include_directories("${PROJECT_SOURCE_DIR}/inc/")
add_subdirectory(src)
add_executable(${EXECUTABLE_NAME} main.cpp ${SOURCE})