2009-07-09 47 views
1

我有一些我的班级每OS不同的实现包容性。
我的源结构是这样的:多C++项目:平台的具体来源

  • 包括/ AExample.h
  • 包括/窗/ WindowsExample.h
  • 包括/ LINUX/LinuxExample.h
  • SRC/AExample.cpp
  • SRC /窗/ WindowsExample.cpp
  • src/linux中/ LinuxExample.cpp

A *类是特定实现的接口

我目前的构建系统是cmake - 但目前它唯一能够构建Linux版本。

在Windows打造我只需要包含Windows/*文件,并仅在Linux上在Linux/*文件

我需要

  • 只包括有关我目前的文件建立
  • 选择权实现的时候,我需要AExample

你可以推荐什么技术,以专业的方式来实现这一实例?

回答

7

这是CMake的相当容易。

只要您的CMakeLists.txt文件检查平台,并根据需要添加相应的文件或包含适当的子目录。

的基本语法是:

IF(WIN32) 
    # Do windows specific includes 
ELSEIF(UNIX) 
    # Do linux specific includes 
ENDIF(WIN32) 
2

如果标题具有相同的名称,但他们居住在不同的层次,你可以设置-I(包括路径)标志正确地为你的编译。这比处理所有依赖于平台分别包括容易得多。

如果头驻留在同一目录和/或你想定制的东西,你通常会在C做/ C++代码:

#ifdef _WIN32 
    .. include Win headers .. 
#endif 

#ifdef LINUX 
    .. include Linux headers ... 
#endif 

我不会建议CMake的具体解决方案,除非你确信你没有在以后需要切换构建系统。

+1

这不处理包括在构建不同的源文件,虽然。使用CMake通常会导致适当的设置,但您也可以包含特定于平台的源文件。这是首先使用cmake的许多好理由之一。 – 2009-07-09 19:41:34

0

尽管我认为使用构建系统来处理跨平台文件是最好的,但可以简单地编写源代码来通过预处理器处理它。但是这样做,在那里你撒平台检查各地的代码很普通,快速和肮脏的方法是有问题的,应予以避免。

相反,您应该使用更高度结构化的方法来组织特定于平台的代码,以避免随着项目规模的扩大而出现问题。

平台相关的代码应明确在文件级别:例如,使用与每个平台目录的目录结构,并把所有的平台特定源文件在相应的目录。源文件不应包含多个平台或任何预处理器平台检查的代码(但只有一个例外)。此外,平台特定的源通常不应直接构建或d。相反,特定于平台的代码只能通过非特定于平台的源文件间接使用,除平台特定文件的平台检查和平台特定文件外,其他文件均不包含任何内容。

实施例源组织:

src/ 
    main.cpp 
    foo.h 
    foo.cpp 
    windows/ 
    foo.cpp.inc 
    posix/ 
    foo.cpp.inc 

示例源内容:

// main.cpp 
#include "foo.h" 

int main() { 
    foo(); 
} 

// foo.h 
void foo(); 

// foo.cpp 
#if defined(_WIN32) 
# include "windows/foo.cpp.inc" 
#elif __has_include(<unistd.h>) 
# include<unistd.h> 
# if defined(_POSIX_VERSION) 
# include "posix/foo.cpp.inc" 
# endif 
#else 
# error Unknown platform 
#endif 

// windows/foo.cpp.inc 
#include "foo.h" 

#include <iostream> 
#include <Windows.h> 

void foo() { 
    std::cout << "Windows\n"; 
} 

// posix/foo.cpp.inc 
#include "foo.h" 

#include <iostream> 
#include <unistd.h> 

void foo() { 
    std::cout << "POSIX\n"; 
} 

视窗构建和输出:

cl.exe /EHsc /W4 /WX src\main.cpp src\foo.cpp
main

的Windows

Linux构建和输出:

g++ -Wall -Wextra -Werror -Isrc src/main.cpp src/foo.cpp
./a.out

POSIX

在上面的例子中所示的方法效果很好,当针对不同平台的代码可以合理地共享相同的文件组织。如果针对不同平台的代码非常不同,你要为每个平台不同的文件结构,那么它更难使用这种技术,并且移动到使用构建系统来管理不同平台变得更加明显优于代码。

也有可能这种技术用在构建系统混用;跨平台共享文件结构的代码可以使用它,而不同平台独有的模块可以由构建系统处理。