CMake + Qt Creator:将 header 个文件添加到项目文件
CMake + Qt Creator: Add header files to project files
如果我在目录 src
中有 .h
和 .cpp
文件,其中 .cpp
文件包含 .h
文件,使用这些命令CMake:
aux_source_directory(src SRC_LIST)
add_executable(${PROJECT_NAME} ${SRC_LIST})
然后在 Qt Creator 中打开该 CMake 文件,获取项目文件列表(默认情况下左侧的文件树)中的所有文件(sources + headers)。
现在,另一方面,如果我将所有 .h
文件放在目录 include
中,然后使用:
include_directories(include)
aux_source_directory(src SRC_LIST)
add_executable(${PROJECT_NAME} ${SRC_LIST})
header 个文件从项目文件中消失了!
我怎样才能将 header 文件保留在该目录中,并且仍然将它们列在 Qt Creator 的项目文件中?
您不应该使用 aux_source_directory()
来完成您的任务。该命令用于不同的东西。只需列出源文件(或将它们放在变量中)。
您不应再使用 include_directory()
来定义包含目录。此命令只会填充编译器的 -I
标志。用头文件定义一个变量并将其添加到可执行文件中。
如果您不想手动列出每个文件,请使用 file(GLOB ...)
。但请注意网络上经常提到的使用该命令的注意事项。
之后,告诉 CMake 只为 include
目录的可执行文件填充 -I
标志。这样,其他目标就不会被包含污染,它们不应该使用。
set(SOURCES
src/main.cpp
src/whatever.cpp)
set(HEADERS
include/whatever.h)
add_executable(${PROJECT_NAME} ${SOURCES} ${HEADERS})
target_include_directories(${PROJECT_NAME} PUBLIC include)
我总是明确地添加我的头文件以避免任何意外。
但是在使用 QtCreator 4.2.0 和 cmake 3.7.1 的 MacOS 上我无法重现你的问题。
不过,我建议使用以下结构来了解项目中有哪些文件,并在 CMakeLists.txt 更新期间触发 cmake 数据的更新。
在project/CMakeLists.txt:
add_subdirectory(src)
include_directory(include)
add_executable(foo ${SRC_LIST})
在project/src/CMakeLists.txt:
set(SRC_LIST
${SRC_LIST}
${CMAKE_CURRENT_SOURCE_DIR}/a.cpp
${CMAKE_CURRENT_SOURCE_DIR}/b.cpp
PARENT_SCOPE
)
如果我在目录 src
中有 .h
和 .cpp
文件,其中 .cpp
文件包含 .h
文件,使用这些命令CMake:
aux_source_directory(src SRC_LIST)
add_executable(${PROJECT_NAME} ${SRC_LIST})
然后在 Qt Creator 中打开该 CMake 文件,获取项目文件列表(默认情况下左侧的文件树)中的所有文件(sources + headers)。
现在,另一方面,如果我将所有 .h
文件放在目录 include
中,然后使用:
include_directories(include)
aux_source_directory(src SRC_LIST)
add_executable(${PROJECT_NAME} ${SRC_LIST})
header 个文件从项目文件中消失了!
我怎样才能将 header 文件保留在该目录中,并且仍然将它们列在 Qt Creator 的项目文件中?
您不应该使用 aux_source_directory()
来完成您的任务。该命令用于不同的东西。只需列出源文件(或将它们放在变量中)。
您不应再使用 include_directory()
来定义包含目录。此命令只会填充编译器的 -I
标志。用头文件定义一个变量并将其添加到可执行文件中。
如果您不想手动列出每个文件,请使用 file(GLOB ...)
。但请注意网络上经常提到的使用该命令的注意事项。
之后,告诉 CMake 只为 include
目录的可执行文件填充 -I
标志。这样,其他目标就不会被包含污染,它们不应该使用。
set(SOURCES
src/main.cpp
src/whatever.cpp)
set(HEADERS
include/whatever.h)
add_executable(${PROJECT_NAME} ${SOURCES} ${HEADERS})
target_include_directories(${PROJECT_NAME} PUBLIC include)
我总是明确地添加我的头文件以避免任何意外。 但是在使用 QtCreator 4.2.0 和 cmake 3.7.1 的 MacOS 上我无法重现你的问题。
不过,我建议使用以下结构来了解项目中有哪些文件,并在 CMakeLists.txt 更新期间触发 cmake 数据的更新。
在project/CMakeLists.txt:
add_subdirectory(src)
include_directory(include)
add_executable(foo ${SRC_LIST})
在project/src/CMakeLists.txt:
set(SRC_LIST
${SRC_LIST}
${CMAKE_CURRENT_SOURCE_DIR}/a.cpp
${CMAKE_CURRENT_SOURCE_DIR}/b.cpp
PARENT_SCOPE
)