设置基本的多平台cmake启用项目时需要帮助

zer*_*ble 4 c++ makefile header project-structure cmake

tl; dr问题在底部.

我是一个尝试新事物的开发人员 - 我的最后一个毒药是c ++.正如我在我的Linux笔记本电脑,而另一半Win XP的电脑上花了我一半的时间,我试图找到一种方法来创建基本的,准系统项目,用好C++的做法(当然,我不知道从经验他们,我刚看过他们).现在,我的项目,而使用几乎适用cmake . && make于Linux操作系统(它的工作原理时,头文件和源文件相同的文件夹,当我把它们分开,包括/ src目录文件夹失败).我使用的MinGW的nuwen的分布在Windows(我知道,工具链工作,它编译项目在Eclipse中没有任何问题).

我的项目目录如下所示:

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

    |- CMakLists.txt (1)
Run Code Online (Sandbox Code Playgroud)

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

App.h:

class App {
   public:
      App();
      int onExecute();
};
Run Code Online (Sandbox Code Playgroud)

App.cc:

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

App::App() {
}

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

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';
}
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

CMakeLists.txt(2) - 在include目录中

add_library (Application App)
set_target_properties (Application PROPERTIES LINKER_LANGUAGE CXX)
Run Code Online (Sandbox Code Playgroud)

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

include_directories (../include)
Run Code Online (Sandbox Code Playgroud)

这是我得到的 - 有一些变化(即将App.cc移动到include目录)整个事情编译并在linux上运行良好 - 但我无法让mingw生成器在Win XP上运行.我手动调整文件CMakeCache.txt中的CMAKE_MAKE_PROGRAM以指向正确的make.exe(我知道这应该被定义为系统变量但是因为我在许多不同的PC上工作,我不想留下垃圾后我).

我的问题是:

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

2)如何解决未找到头文件的错误(make give:(...)\ engine\main\src\main.cc:2:17:致命错误:App.h:没有这样的文件或目录)?

感谢您的时间和帮助.

Ped*_*ino 6

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

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

马上我认为你真的应该使用源代码构建.这意味着您不要在代码所在的同一目录中运行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 <somefolder/header.h>(使用<>而不是引号告诉C++预处理器在查找文件时跳过当前目录).


2)如何解决未找到头文件的错误(make give:(...)\ engine\main\src\main.cc:2:17:致命错误:App.h:没有这样的文件或目录)?

有许多与你cmake的布局问题,但你得到的是错误的原因是因为你需要调用include_directoriesCMakeLists.txt (1)为好.

除此之外,您的其他CMakeLists.txt文件也存在问题.在CMakeLists.txt (2),争论add_library是错误的; 它应该是../src/App.cc,否则你只是添加一个空库.而且你也不需要,set_target_properties至少在没有add_library正确的论据时也是如此.您还需要一个include_directoryCMakeLists.txt添加库相同的调用; 把它放进去(3)并没有真正做任何事情.

实际上,您不需要CMakeLists.txt目录中的include文件,因为那里没有任何内容可以构建.在add_library打电话CMakeLists.txt (3)后立即拨打电话会更好include_directories.

我希望这能解决你的一些疑虑.