【问题标题】:Help needed while setting up basic multiplatform cmake-enabled project设置支持 cmake 的基本多平台项目时需要帮助
【发布时间】:2011-05-04 08:24:45
【问题描述】:

tl;dr 问题在底部。

我是一名尝试新事物的开发人员——我最后的毒药是 c++。由于我一半时间花在我的 linux 笔记本电脑上,另一半时间花在 Win XP PC 上,我试图找到一种方法来创建基本的准系统项目,使用良好的 c++ 实践(好吧,我不从经验中了解它们,我刚读到他们)。现在我的项目在 linux 上使用 cmake . && make 时几乎可以工作(当头文件和源文件在同一个文件夹中时它可以工作,当我将它们分开以包含 / src 文件夹时失败)。我在 windows 上使用 nuwen 的 mingw 发行版(而且我知道工具链正在工作,它从 Eclipse 中编译项目没有任何问题)。

我的项目目录如下所示:

engine 
    |
    |- main
         |
         |- include
                 |
                 |- App.h  
                 |- CMakeLists.txt (2)
         |- src
             |
             |- main.cc
             |- App.cc
             |- CMakeLists.txt (3)

    |- CMakLists.txt (1)

文件的内容非常简单(为了清楚起见,我将删除包含保护等)

应用程序.h:

class App {
   public:
      App();
      int onExecute();
};

App.cc:

#include <iostream>
#include "App.h"

App::App() {
}

int App::onExecute() {
   std::cout << "inside app.." << '\n';
   return 0;
}

main.cc:

#include <iostream>
#include "App.h"

using namespace std;

int main(int argc, char* argv[]) {
  App a;

  a.onExecute();
  std::cout << "inside main.." << '\n';
}

CMakeLists.txt(1)——主要的:

cmake_minimum_required (VERSION 2.6)
set (CMAKE_CXX_COMPILER "g++")

project (gameengine)

add_definitions ( "-Wall -ansi -pedantic")

add_subdirectory (${CMAKE_SOURCE_DIR}/main/include)
add_subdirectory (${CMAKE_SOURCE_DIR}/main/src)

add_executable (engine ${CMAKE_SOURCE_DIR}/main/src/main.cc)
target_link_libraries (engine Application)

CMakeLists.txt (2) - 包含目录内

add_library (Application App)
set_target_properties (Application PROPERTIES LINKER_LANGUAGE CXX)

CMakeLists.txt (3) - src目录内

include_directories (../include)

据我所知-通过一些更改(即将 App.cc 移动到包含目录)整个东西在 linux 上编译并运行良好-但我无法让 mingw 生成器在 Win XP 上工作.我手动调整文件 CMakeCache.txt 中的 CMAKE_MAKE_PROGRAM 以指向正确的 make.exe(我知道这应该定义为系统变量,但由于我在许多不同的 PC 上工作,我不想在之后留下垃圾我)。

我的问题是:

1) 编写多平台 CMakeLists.txt 文件的指南是什么(独立于操作系统和项目文件的位置),这最好能让我轻松地从一个操作系统切换我的项目配置?

2) 如何解决找不到头文件的错误(make 给出:(...)\engine\main\src\main.cc:2:17: fatal error: App.h: No such文件或目录)?

感谢您的时间和帮助。

【问题讨论】:

    标签: c++ header makefile cmake project-structure


    【解决方案1】:

    这可能不是您期望的答案,但由于您没有说明是否需要其他解决方案,我还是会建议您:

    对于多平台项目,我会推荐SConstruct,它确实是一个很棒且灵活的工具。我不太了解 CMake,所以我真的可以提供详细的比较。

    但是,我喜欢这个工具的原因如下:

    • 它是 Python。因此,您几乎可以针对定制和/或特殊需求做任何您想做的事情
    • 它非常容易学习,对于简单的项目,只需几行代码即可上手。
    • 它完全依赖于 Python,因此在 Linux 上它通常已经安装,而在 Windows 上下载和安装需要 5 分钟。
    • 它具有非常好的自动依赖树生成和并行编译支持。

    【讨论】:

    • 我认为 Scons 有很大的潜力,主要是因为使用了 Python,但现在我想说 CMake 是最成熟的选择。我们在 Mac OS、Linux 和 Windows 项目的工作中一直使用它,它的效果非常好。您可以为 VC++6.0 到 VC++10 以及 Xcode 和 Eclipse 项目文件生成 .sln 文件这一事实令人惊叹。
    • @Pedro d'Aquino:我对 CMake 的了解不够,所以我不能真正谈论它。但我确实相信它是一个很棒的工具,正如你所说,一个成熟的选择。我相信 SConstruct 不支持生成 .sln 文件。但是,这可以很容易地添加。
    【解决方案2】:

    1) 编写多平台 CMakeLists.txt 文件的指南是什么(独立于操作系统和项目文件的位置),这最好能让我轻松地从一个操作系统切换我的项目配置?

    好吧,我当然不是专家,但我可以分享我 10 个月的跨平台基于 cmake 项目的经验。

    我认为你真的应该使用非源代码构建。这意味着您不会在代码所在的同一目录中运行 cmake;相反,您创建一个新文件夹,例如engine/build 并从那里运行 cmake ../main。这样你就不会用 cmake 的东西破坏你的源文件,比如 CMakeCache.txt 等。你甚至可以使用一些宏来禁止你的用户进行源内构建。

    我还发现创建一组宏文件以帮助为不同平台设置编译器选项很有用。在工作中,我们有诸如ADD_GCC_FLAG 或ADD_MSVC_FLAG 之类的宏,它们检查当前编译器并相应地添加标志。

    我认为最好有一个 .cmake 文件,它将您的所有项目配置集中在一个地方。在工作中,我们所有的CMakeLists.txt 都以include( ../cmake/configs.cmake ) 开头。该文件设置了各种选项,例如标准包含目录、默认编译器标志等。

    为了缓解包含目录的问题,我建议您在源文件中使用绝对路径而不是相对路径。定义一个标准的包含目录,例如engine/main/include 和始终#include 相对于该路径的文件。在你的例子中,如果你想包含engine/main/include/somefolder/header.h,你会写#include &lt;somefolder/header.h&gt;(使用&lt;&gt;而不是引号告诉C++预处理器在查找文件时跳过当前目录)。


    2) 如何解决找不到头文件的错误(make 给出:(...)\engine\main\src\main.cc:2:17: fatal error: App.h: No such文件或目录)?

    您的 cmake 布局存在许多问题,但您收到该错误的原因是您还需要在 CMakeLists.txt (1) 中调用 include_directories。

    除此之外,您的其他CMakeLists.txt 文件也有问题。在CMakeLists.txt (2) 中,add_library 的参数是错误的;它应该是../src/App.cc,否则你只是在添加一个空库。而且您也不需要set_target_properties,至少如果您的add_library 参数正确,则不需要。您还需要在添加库的同一 CMakeLists.txt 中调用 include_directory;将其放入 (3) 并没有真正做任何事情。

    实际上,您不需要在include 目录中创建CMakeLists.txt 文件,因为那里没有可构建的内容。最好在调用include_directories 之后将add_library 调用放入CMakeLists.txt (3)。

    我希望这能消除你的一些疑虑。

    【讨论】:

    • 非常感谢您的建议。这是我所期待的那种建议。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-10
    • 2020-08-17
    • 2021-12-13
    • 2010-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多