【问题标题】:How to separate header file and source file in CMake?如何在 CMake 中分离头文件和源文件?
【发布时间】:2017-07-20 20:45:54
【问题描述】:

我的项目结构如下:

--root: main.cpp CMakeLists.txt 

    --src: function.cpp CMakeLists.txt 

    --include: function.h

main.cpp:

#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,实现功能分开实现?更进一步,如何在 main 中调用它们。 CMake not finding proper header/include files in include_directories 中的可能解决方案。但是还是不符合我的情况。

【问题讨论】:

  • ${SOURCES} 不应包含头文件。使用include_directories 指定include 路径。
  • @πάνταῥεῖ 您可以将头文件放在目标的源中。 CMake 不会尝试编译它们,而是其他工具,例如IDE,可以在列表/树中显示标题,这非常好。
  • 如何在 Qt 树中显示包含/标题正是我想要的。但是我不太明白你上面提到的具体操作。也许你可以告诉我如何在下面接受的答案中添加操作。
  • @Biffen 谢谢你的帮助。

标签: c++ cmake


【解决方案1】:

在根目录中:

project(t1)
cmake_minimum_required(VERSION 2.8)
include_directories(include)
add_subdirectory(src)               

在源代码中:

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

【讨论】:

  • 如果 main.cpp 在 src 中,您的解决方案完美解决了我的问题。但是如果 main.cpp 在根目录下呢?
  • @Qinchen add_executable(${TARGET} ../main.cpp function.cpp)${CMAKE_SOURCE_DIR}/main.cpp
  • 为什么要在 src 子目录中设置目标?这让我觉得有点搞砸了。我想设置我的目标顶层并告诉它使用 src 目录中的东西。
【解决方案2】:

今天,我也有同样的问题,我找到了解决办法。

根目录下的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)

感谢代码、技术和教程和他的视频https://www.youtube.com/watch?v=kEGQKzhciKc&t=606s。这有助于我有一个想法来解决这个问题

【讨论】:

    猜你喜欢
    • 2021-09-15
    • 2017-06-29
    • 1970-01-01
    • 2013-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多