尽管我认为使用构建系统来处理跨平台文件是最好的,但可以简单地编写源代码来通过预处理器处理它。但是这样做,在那里你撒平台检查各地的代码很普通,快速和肮脏的方法是有问题的,应予以避免。
相反,您应该使用更高度结构化的方法来组织特定于平台的代码,以避免随着项目规模的扩大而出现问题。
平台相关的代码应明确在文件级别:例如,使用与每个平台目录的目录结构,并把所有的平台特定源文件在相应的目录。源文件不应包含多个平台或任何预处理器平台检查的代码(但只有一个例外)。此外,平台特定的源通常不应直接构建或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
在上面的例子中所示的方法效果很好,当针对不同平台的代码可以合理地共享相同的文件组织。如果针对不同平台的代码非常不同,你要为每个平台不同的文件结构,那么它更难使用这种技术,并且移动到使用构建系统来管理不同平台变得更加明显优于代码。
也有可能这种技术用在构建系统混用;跨平台共享文件结构的代码可以使用它,而不同平台独有的模块可以由构建系统处理。
这不处理包括在构建不同的源文件,虽然。使用CMake通常会导致适当的设置,但您也可以包含特定于平台的源文件。这是首先使用cmake的许多好理由之一。 – 2009-07-09 19:41:34