【问题标题】:CMake with include and source paths - basic setup带有包含和源路径的 CMake - 基本设置
【发布时间】:2012-01-08 09:42:57
【问题描述】:

我正在尝试设置一个看起来像我自己的项目的测试项目,只是为了让事情首先工作,它看起来像这样:

/MainProject/inc/main.h
/MainProject/src/main.cpp
/LibProject/inc/test.h
/LibProject/src/test.cpp

我找到了一些教程,但是当我有 inc 和 src 文件夹时,我不知道如何设置它? CMakeLists.txt 文件的外观如何?我会在 / 每个项目文件夹中有一个吗?好像我不需要在 inc 和 src 文件夹中有一个?

【问题讨论】:

    标签: c++ cmake


    【解决方案1】:

    每个源子目录都需要一个CMakeLists.txt。您的结构应如下所示:

    root
    |-MainProject
    | |-inc
    | | '-main.h
    | |-src
    | | |-main.cpp
    | | '-CMakeLists.txt
    | '-CMakeLists.txt 
    |-LibProject
    | |-inc
    | | '-test.h
    | |-src
    | | |-test.cpp
    | | '-CMakeLists.txt
    | '-CMakeLists.txt
    '-CMakeLists.txt
    

    root/CMakeLists.txt的内容:

    project(MyProject)
    add_subdirectory(MainProject)
    add_subdirectory(LibProject)
    

    LibProject/CMakeLists.txtMainProject/CMakeLists.txt的内容:

    add_subdirectory(src)
    

    LibProject/src/CMakeLists.txt的内容:

    # Notice name prefix of this variable, set by CMake according
    # to value given with "project()" in the root CMakeLists.txt.
    include_directories(${MyProject_SOURCE_DIR}/LibProject/inc)
    add_library(LibProject test.cpp)
    

    MainProject/src/CMakeLists.txt的内容:

    include_directories(${MyProject_SOURCE_DIR}/MainProject/inc)
    # I assume you want to use LibProject as a library in MainProject.
    include_directories(${MyProject_SOURCE_DIR}/LibProject/inc)
    link_directories(${MyProject_SOURCE_DIR}/LibProject/src)
    add_executable(MainProject main.cpp)
    target_link_libraries(MainProject LibProject)
    

    然后配置和构建:

    $ cd root
    $ mkdir build
    $ cd build
    $ cmake ..
    $ make
    

    【讨论】:

    • 重点不是复制你的答案,而是完成它。据我所知,如果没有两个缺失的CMakeLists.txt 和缺失的link_directories() 命令,它将无法工作。我最初打算评论您的答案,但我的声誉太低,无法做到这一点。所以我认为发布第二个答案将是最独立的方式。不是有意冒犯你。
    • 它必须在没有 link_directories 的情况下工作,因为它是由同一个项目构建的库。至于路径问题你是对的,我会纠正它。
    • @user912403:这是否意味着你的问题已经解决了?然后通过单击左侧的复选标记来接受两个答案之一。我会推荐 Roman 的,因为它更简洁。如果您选择我的,请验证MainProject/src/CMakeLists.txt 中的link_directories 命令是否真的有必要,以便我可以相应地编辑答案。
    • 我需要 MainProject 和 LibProject 文件夹以及 src 文件夹中的 CMakeLists.txt.. 但是 subdir() 不起作用.. 它必须是 subdirs()
    • MyProject_SOURCE_DIR 设置在哪里?
    【解决方案2】:

    你可以像下面那样做。

    • 您的 MainProject 目录中的 CMakeLists.txt:

      project(MainProject)
      
      add_subdirectory(LibProject/src)
      add_subdirectory(MainProject/src)
      
    • 您的 LibProject/src 目录中的 CMakeLists.txt:

      include_directories(${PROJECT_SOURCE_DIR}/LibProject/inc/)
      add_library(LibProject test.cpp)
      
    • 您的 MainProject/src 目录中的 CMakeLists.txt:

      include_directories(${PROJECT_SOURCE_DIR}/MainProject/inc/)
      add_executable(MainProject main.cpp)
      target_link_libraries(MainProject LibProject)
      

    【讨论】:

    • 请问你为什么有${PROJECT_SRC_DIR}?我遇到了 CMake 错误,必须按如下方式更正变量:${PROJECT_SOURCE_DIR} 使其工作
    • 根据文档,它应该是 PROJECT_SOURCE_DIR。您可以在这里找到详细信息:cmake.org/Wiki/CMake_Useful_Variables
    【解决方案3】:

    就我而言,我想用一个单个 CMakeList 来完成。它对我有用。我添加了我的解决方案,以防它适用于任何人。

    这就是我在我的案例中所做的:

    My structure:
    Project
    |CMakeLists.txt
    |-src
    | |*.cpp
    | |*.c
    |-include
    | |*.hpp
    | |*.h
    

    我的 CMakeLists.txt 必须是主要部分:

    include_directories(
            ${PROJECT_SOURCE_DIR}/include
            ${PROJECT_SOURCE_DIR}/src
    )
    

    ^ 允许 .cpp 文件在包含文件夹中添加标头。

    file(GLOB all_SRCS
            "${PROJECT_SOURCE_DIR}/include/*.h"
            "${PROJECT_SOURCE_DIR}/include/*.hpp"
            "${PROJECT_SOURCE_DIR}/src/*.cpp"
            "${PROJECT_SOURCE_DIR}/src/*.c"
            )
    

    ^ 只需添加这些文件夹中的任何内容。

    add_executable(MyTarget ${all_SRCS})
    

    ^ 从所有源列表中构建目标

    PS:如果您想查看完整的 CMakeLists.txt,请转到项目链接 NEGU93/ForbiddenDesert

    【讨论】:

    • 是的,这将生成一个 Makefile,如果头文件发生更改,它将正确重新编译适当的文件。我不确定之前的建议是否会这样做(或者至少他们没有明确显示)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-06
    • 1970-01-01
    • 2014-03-06
    • 1970-01-01
    • 1970-01-01
    • 2016-11-13
    • 1970-01-01
    相关资源
    最近更新 更多