首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >设置基本的多平台cmake支持项目时所需的帮助

设置基本的多平台cmake支持项目时所需的帮助
EN

Stack Overflow用户
提问于 2010-11-03 07:19:19
回答 2查看 1.5K关注 0票数 5

博士的问题在下面。

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

我的项目目录如下所示:

代码语言:javascript
复制
engine 
    |
    |- main
         |
         |- include
                 |
                 |- App.h  
                 |- CMakeLists.txt (2)
         |- src
             |
             |- main.cc
             |- App.cc
             |- CMakeLists.txt (3)

    |- CMakLists.txt (1)

文件的内容非常简单(为了清晰起见,我将删除包含的警卫等)。

附录h:

代码语言:javascript
复制
class App {
   public:
      App();
      int onExecute();
};

App.cc:

代码语言:javascript
复制
#include <iostream>
#include "App.h"

App::App() {
}

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

main.cc:

代码语言:javascript
复制
#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) -主要内容:

代码语言:javascript
复制
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) -在包含目录中

代码语言:javascript
复制
add_library (Application App)
set_target_properties (Application PROPERTIES LINKER_LANGUAGE CXX)

CMakeLists.txt (3) -在src目录中

代码语言:javascript
复制
include_directories (../include)

这就是我所得到的--通过一些更改(即将App.cc移到包含目录),整个程序在linux上编译和运行都很好--但我无法让mingw生成器在Win XP上工作。我手动调优了文件CMakeCache.txt中的CMakeCache.txt以指向正确的make.exe (我知道这应该被定义为一个系统变量,但由于我正在处理许多不同的PC,我不想留下垃圾邮件)。

我的问题是:

1)编写多平台CMakeLists.txt文件(它将独立于os和项目文件的位置)的指导方针是什么,这最好允许我从一个os和另一个os轻松地处理我的项目配置?

2)如何解决找不到头文件的错误(让我给出:(.\engine\main\src\main.cc:2:17:致命错误: App.h:没有此类文件或目录)?

谢谢你的时间和帮助。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-11-03 11:45:19

1)编写多平台CMakeLists.txt文件(它将独立于os和项目文件的位置)的指导方针是什么,这最好允许我轻松地从一个os和另一个os中轻松地处理项目配置?

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

一开始,我认为你真的应该在源代码之外使用构建。这意味着您不会在代码所在的同一个目录中运行cmake;而是创建一个新文件夹,例如engine/build和从那里运行cmake ../main。这样你就不会用cmake之类的东西来破坏你的源文件了,甚至还有一些宏可以用来禁止用户在源代码中进行构建。

我还发现创建一组宏文件以帮助设置不同平台的编译器选项也很有用。在这里,我们有一些宏,如ADD_GCC_FLAGADD_MSVC_FLAG,它们检查当前编译器并相应地添加标志。

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

为了缓解包含目录的问题,我建议您在源文件中使用绝对路径而不是相对路径。定义一个标准的包含目录,例如engine/main/include,并且总是相对于该路径的#include文件。在您的示例中,如果您想包含engine/main/include/somefolder/header.h,您可以编写#include <somefolder/header.h> (使用<>而不是引号告诉C++预处理程序在查找文件时跳过当前目录)。

如何解决找不到头文件的错误(

给出:(.)\engine\main\src\main.cc:2:17:致命错误: App.h:没有这样的文件或目录)?

您的cmake布局有很多问题,但是您得到这个错误的原因是您也需要在include_directories中调用CMakeLists.txt (1)

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

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

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

票数 7
EN

Stack Overflow用户

发布于 2010-11-03 08:16:19

这可能不是你所期望的答案,但既然你没有说明你是否喜欢替代解决方案,我还是会建议:

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

然而,以下是我喜欢这个工具的原因:

  • ,是Python。因此,您几乎可以做任何您想做的关于定制和/或特殊需要的
  • --它非常容易学习,对于简单的项目来说,它只需要几行代码就可以开始。
  • --它完全依赖于
  • --所以在Linux上它经常安装,在Windows上下载和安装需要5分钟。
  • 有一个--非常好的自动依赖树生成和并行编译支持。

< code >F 212

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4084917

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档