2011-06-27 54 views
2

我想让Makefile能够在Linux和Solaris中编译。 我知道如何单独做到这一点,但我怎样才能将两者结合起来,并且能够检测到我正在使用的是哪种操作系统? 我正在试图做一个简单的C文件 - 但它是编译器的名称更改。如何在Linux和Solaris中编译C?

+0

您确定需要吗?你是否都在使用gcc? – Foon

+0

@Foon我只知道要在Linux中编译我做gcc或g ++,而在Solaris中我需要cc。或者我错了吗? – drum

+1

在Linux上有一个'cc'(或者'c99',或者'c89',如果你是老式的),它就是连接到'gcc'的地方。默认的编译器在每个平台上通过内置在“make”中的默认规则正确选择的可能性很大。 –

回答

5

GNU Autoconf被设计来解决这个问题很:

的Autoconf是产生shell脚本 自动配置软件 源代码包 M4宏的扩展包。这些脚本 可以将这些软件包适应类UNIX系统的多种类型 ,而无需用户干预手动 。 Autoconf从模板文件为 包创建 配置脚本,该模板文件列出 包可使用的操作系统功能,格式为M4 宏调用。

我已经使用Autoconf自己做了几个简单的项目。你可以看看源代码,看看如何使用autoconf简单的功能检测:

注意的Autoconf的目的不是为了检测操作系统。相反,它旨在检测操作系统上可能存在或不存在的功能,设置等。

想到问这个问题:“在此平台上调用的C编译器是什么?”不是“我在Linux或Solaris上运行吗?”

0

我相信大多数人会说使用一些奇特的autotools的东西。他们当然是对的。

但是......你可以在你的makefile文件中加入如下内容。

OS = `uname -s` 
ifeq ($(OS),Linux) 
    ... 
endif 
ifeq ($(OS),Sun) 
    ... 
endif 
+1

我已经看到了这种方法导致的痛苦。想象一下你想在这个系统下支持一个新的操作系统,你必须通过并手动扩展你的Makefile逻辑来应付......你必须记住哪个操作系统支持哪些功能,并且希望它们永不改变。用这种方法维护了一个大型的应用程序,这真是一场噩梦,Autoconf很难学,但是值得付出努力。检测功能,而不是操作系统! –