Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Makefile:根据CC/CXX/FC值更改编译器标志_C++_C_Gcc_Makefile_Fortran - Fatal编程技术网

C++ Makefile:根据CC/CXX/FC值更改编译器标志

C++ Makefile:根据CC/CXX/FC值更改编译器标志,c++,c,gcc,makefile,fortran,C++,C,Gcc,Makefile,Fortran,这似乎很荒谬,因为现在还没有关于这个的问题,但我找不到一个。无论如何,我正在编写一个makefile,我只想有一个条件语句,根据GNU或Intel编译器是用来编译程序的,由环境变量CC设置,来设置不同的CFLAG 现在,GNU make手册中有一节介绍了这一点,它说要做如下操作: (确定设置库不是标志,但不管怎样,都是相同的想法)。好吧,但这肯定只是条件句如何工作的一个例子,因为在实践中,这显然是一种愚蠢的方法。CC变量可以包含除“gcc”之外的所有内容,并且仍然可以有效地使用gnuc编译器。

这似乎很荒谬,因为现在还没有关于这个的问题,但我找不到一个。无论如何,我正在编写一个makefile,我只想有一个条件语句,根据GNU或Intel编译器是用来编译程序的,由环境变量CC设置,来设置不同的CFLAG

现在,GNU make手册中有一节介绍了这一点,它说要做如下操作:

(确定设置库不是标志,但不管怎样,都是相同的想法)。好吧,但这肯定只是条件句如何工作的一个例子,因为在实践中,这显然是一种愚蠢的方法。CC变量可以包含除“gcc”之外的所有内容,并且仍然可以有效地使用gnuc编译器。即使只是在CC中指定编译器的绝对路径,也会破坏这个示例


那么,明智、稳健的做法是什么呢?另外,如果它是重要的,我也想对C++和FORTRAN编译器的选择做同样的事情。

< P>你是正确的,这不是很健壮。更可靠的方法是使用findstring命令,例如:

ifneq (,$(findstring gcc,$(CC)))
  libs=$(libs_for_gcc)
else
  libs=$(normal_libs)
endif

最明智和最健壮的方法(IMHO)是使用诸如CMake之类的makefile编译器为您生成makefile。CMake(和其他人)知道不同的平台和工具集。但是,即使使用CMake,如果您想根据编译器设置其他编译器标志(或不同的LIB等),您仍然需要检测编译器(通常根据CMake_CXX_编译器ID)。因此,您可能仍然无法完全摆脱编译器检测(例如,如果您想使用GCC/CLang强制“-Wall-Wextra-Werror”,而其他编译器可能无法识别)。但确实,如果我有选择的话,我也更喜欢使用CMake。是的,CMake肯定更好,但是我实际上在处理一些遗留代码,我只想修复现有的Make文件,这样它就不会那么容易被破坏。嗯,是的,像这样的东西似乎至少是下一步的改进:)。但是,如果不使用完整的autotools/cmake类型的系统,这是最好的方法吗?
ifneq (,$(findstring gcc,$(CC)))
  libs=$(libs_for_gcc)
else
  libs=$(normal_libs)
endif