我目前正在使用Visual 2012、Eclipse、CodeBlocks和MinGW编写C++ 11代码。
问题:
我注意到GCC (递延,=相对于即时,:=,扩展/分配等等)和微软的nmake中的一些特性,这让我想知道正式的"makefile“标准是什么。
背景:
困难之处在于,我试图确保代码在每个环境中编译,同时也试图将代码交叉编译到其他目标(Linux/Ubuntu使用OpenGL API,Windows 7,8使用DirectX,Android )。
我的核心问题之一是,我使用的许多工具集并不真正“开放”支持跨平台敬畏。
Visual 2012: No *nix可运行编译器。使用有缺陷的版本的2012年11月C++ CTP编译器的C++11支持。
GCC 4.7.x/4.8x:仅限于MinGW32和MinGW64的粗略版本。
CMake:很难正确配置,但似乎要创建特定于GNU、Microsoft等的makefile。有什么方法可以将其配置为生成“标准”makefile吗?
AutoMake/AutoConf:似乎只生成与GNU兼容的makefile
发布于 2013-05-20 15:49:56
对于make系统,没有C++标准。这纯粹是实现定义的东西。
对于跨平台工作(包括跨操作系统和跨工具链),我发现最流行的选择是CMake。我不喜欢CMake的语法或各种复杂性,我不喜欢使用它--但它确实有效,而且似乎每个人都使用它。您在一个项目中获得的CMake技能将传递给许多其他项目。
是的,您可以从CMake中获得“标准”makefile。这是发电机的一个功能:
cmake -G "Unix Makefiles" ...将生成与*nix make兼容的makefile。
发布于 2013-05-20 17:04:03
GNU是用于make的POSIX规范的实现,您可以在这里找到http://pubs.opengroup.org/onlinepubs/9699919799/在"Shell和实用程序“下搜索" make”。然而,您很快就会发现,make中标准化的部分非常贫乏,不会让您创建非常复杂的生成环境。这就是GNU拥有这么多额外特性和功能的原因。
此外,Windows开发人员不太关心POSIX,特别是POSIX的shell和实用程序部分。因此,即使您可以将自己限制在该子集上,它也不会为您购买太多: POSIX实例之间的可移植性,这些实例基本上不使用GNU (默认情况下,Linux和MacOS都使用GNU )。
你基本上有两种选择:你可以得到一个可以跨多个平台工作的构建工具(例如,generate,可以编译并在当今几乎所有可用的操作系统上使用,但是还有其他工具,比如scon、厨师、胸罩等等),或者您可以使用像cmake这样的“元工具”,而不是实际构建代码,而是为您想要使用的任何本机构建工具(make、Eclipse、XCode、VisualStudio)生成构建控制文件,然后使用本机构建工具。
发布于 2013-05-20 20:08:21
答:没有多平台Makefile标准:相反,可以使用标准的、多平台的脚本语言,如PHP、PERL、Python、(SCons)等来编译C++项目。
基于其他人关于他们不是一个统一标准的评论,对一个更永久的、可扩展的、跨平台的解决方案的需求对我来说变得更重要了,(此外,我讨厌制作makefiles!)
因此,在研究了Perl、JavaScript、PHP (甚至Python )之后,我决定使用C++构建C++项目。
我做出这一选择的原因有很多,但主要原因是: 1. PHP工具的数量。2.通过web接口轻松地将其集成到远程构建操作中。3. Windows、Linux、BSD、OSX的可移植性。4.支持高级逻辑,包括涉及许多嵌套文件夹结构、命名空间和交叉编译的项目。
PHP,其shell脚本支持,跨平台可用性等,是一个自然的适合。
所以,这是我刚才提出的一个小的,快速的,肮脏的概念证明。显然,它没有“做”任何事情,但是它运行/编译非常好,而且它在一个真正的make文件中的工作方式也很容易看到。
谢谢你的帮助!
<?php
// Windows cannot "del /files/*.o /S /Q" because it confuses paths for switches.
// Made my own Variable for Directory Separator for Readability.
$DS = DIRECTORY_SEPARATOR;
// ***********************************************
// **** Compiler Variables
// ***** use PHP: include "Config.php", etc
// ***** to have external variables and functions.
$Compiler = "mingw32-g++.exe";
$DebugFlags = "";
$CompilationFlags = "-std=c++11 -Wall -c -o";
$LinkFlags = "-Wall -o";
$IncludeFlags =
array(
"-I".$DS."Includes",
"-L".$DS."Redist".$DS."Headers"
);
$LibraryLocations =
array(
"-L".$DS."Lib",
"-L".$DS."Redist".$DS."Lib"
);
// ***********************************************
// **** Project Properties
class Project {
public $Name = "";
public $Location = "";
public function __construct($name="Project", $location="")
{
$this->Name = $name;
$this->Location = $location;
}
}
$SubProjects =
array(
new Project("Framework", str_replace("/", $DS, "../Projects/API/Source"))
// new Project("Logging", str_replace("/", $DS, "../Projects/Logging/Projects/API/Source"),
);
// ***********************************************
// **** Environment Variables
$BuildRoot = "D:".$DS."Build".$DS;
$ObjectRoot = $BuildRoot + "OBJs".$DS;
$LibRoot = $BuildRoot + "LIBs".$DS;
$RunRoot = $BuildRoot + "Run".$DS;
$ConfigRoot = getcwd();
$directory = ".".$DS;
$filterList = array(".", "..");
$commandOutput = array("");
$returnValue = 1;
$directoryContents = array_diff(scandir($directory), $filterList);
// ***********************************************
// ***** Main Execution Block
// print_r($SubProjects);
echo PHP_EOL . PHP_EOL;
echo "***********************************************" . PHP_EOL;
echo "***** Building: Starting" . PHP_EOL;
ProcessSubProjects($SubProjects);
echo "***********************************************" . PHP_EOL;
echo "***** Building: Finished" . PHP_EOL;
// ***********************************************
function ProcessSubProjects($subProjects)
{
foreach ($subProjects as $project)
{
$command = 'dir ' . realpath($project->Location);
$commandEcho = array();
// echo $project->Location . PHP_EOL;
// echo realpath($project->Location) . PHP_EOL;
echo PHP_EOL . $command . PHP_EOL . PHP_EOL;
exec ($command, $commandEcho);
foreach ($commandEcho as $message)
{
echo $message . PHP_EOL;
}
}
}
?> https://stackoverflow.com/questions/16653226
复制相似问题