如何在CMake中分离头文件和源文件?

10

我的项目结构如下:

--root: main.cpp CMakeLists.txt 

    --src: function.cpp CMakeLists.txt 

    --include: function.h
:
#include <iostream>
#include "function.h"
using namespace std;

int main(int argc, char *argv[])
{
    //call module in function.hpp
    return 0;
}

根目录下的CMakeLists.txt文件:

 project(t1)
 cmake_minimum_required(VERSION 2.8)
 add_subdirectory(src)               
 file(GLOB_RECURSE SOURCES
     include/function.h
     src/function.cpp)            
 add_executable(${PROJECT_NAME} ${SOURCES})
在src目录中的CMakeLists.txt:
include_directories(${PROJECT_SOURCE_DIR}/include)

如何在根目录和src目录中编写CMakelists以实现函数的分离实现?此外,如何在主函数中调用它们。在CMake未能在include_directories中找到适当的头文件/包含文件中有可能的解决方案,但仍不符合我的情况。


1
${SOURCES} 不应包含头文件。使用 include_directories 指定 include 路径。 - πάντα ῥεῖ
1
@πάνταῥεῖ 你可以将头文件放在目标源代码中。CMake不会尝试编译它们,但其他工具(例如IDE)可以在列表/树中显示头文件,这非常方便。 - Biffen
如何在Qt树中显示包含/头文件正是我所期望的。但是,我并不完全理解您上面提到的具体操作。也许您可以向我展示如何将操作添加到下面接受的答案中。 - Qinchen
@Biffen 谢谢你的帮助。 - Qinchen
解决方案:https://dev59.com/GV4c5IYBdhLWcg3wCGj2 - Qinchen
2个回答

8
在根目录下:
project(t1)
cmake_minimum_required(VERSION 2.8)
include_directories(include)
add_subdirectory(src)               

在src中:

set(TARGET target_name)
add_executable(${TARGET} main.cpp function.cpp)

如果main.cpp在src中,您的解决方案完美地解决了我的问题。但是如果main.cpp在根目录中呢? - Qinchen
3
可以将${CMAKE_SOURCE_DIR}/main.cpp替换成../main.cpp,以便在构建目标时能够找到源文件。因此,add_executable(${TARGET} ../main.cpp function.cpp)表示将../main.cppfunction.cpp编译为可执行文件${TARGET} - fandyushin
4
为什么你想要将目标设置在src子目录中?这让我感觉有点混乱。我想在顶层设置我的目标,然后告诉它使用src目录中的内容。 - RichieHH

1
今天,我有同样的问题并找到了解决方案。
根目录下的CMakeLists.txt:
cmake_minimum_required(VERSION 3.21.3)
project(t1)
add_executable(${PROJECT_NAME} main.cpp)
add_subdirectory(src)
target_include_directories(${PROJECT_NAME} PUBLIC include)
target_link_directories(${PROJECT_NAME} PRIVATE src)
target_link_libraries(${PROJECT_NAME} function)

在src目录下的CMakeLists.txt:
include_directories(../include)
add_library(function function.cpp)

感谢Code, Tech and Tutorial以及他的视频https://www.youtube.com/watch?v=kEGQKzhciKc&t=606s。这帮助我有了解决这个问题的想法。

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