在 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)
将有助于消除此警告。
我有一个使用 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)
将有助于消除此警告。