C++ 在CLion中,仅标题库:file";不属于任何项目目标,code insight功能可能无法正常工作;
我使用cmake命令设置了一个仅标题的库项目: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
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或在命令行上执行所有操作。此外,我在使用include_directories("${PROJECT_SOURCE_DIR}/inc/")
add_subdirectory(src)
add_executable(${EXECUTABLE_NAME} main.cpp ${SOURCE})