有没有办法将-lm设置为gcc的默认值?

时间:2014-11-09 22:48:54

标签: c linux gcc

背景:我最初在1990年在DOS 5上使用Turbo-C学习了C;有很多东西被Turbo-C视为标准,显然不是(即便如此)。

现在我通过" 88 C程序"来刷新自己。我发现当我需要在gcc上使用math.h中的函数时(比如sqrt()log10()等),我必须通过附加-lm来手动链接数学库gcc命令的结束。有没有办法自动执行此操作(例如,使用环境变量),这样,如果我有#include" math.h",我会自动将-lm添加到编译命令中并且不要#39 ; t必须记得键入它吗?作为四核CPU上的单个用户,我并不十分关注微小的性能差异。

潜在重要性:我在Kubuntu 14.04上使用了Ubuntu存储库中的gcc版本及其依赖项。

3 个答案:

答案 0 :(得分:3)

建议你写一个gnu make脚本。

将以下脚本放入名为makefile的文件中:

LDFLAGS+=-lm

all:$elf

$elf:%.o

%.o:%.c

clean:
    rm -rf $elf *.o

然后在您要编译时,键入makemake all

具体而言,$elf存储您要调用可执行文件的名称,替换它或

elf=name

前面没有空间。


顺便说一下,这个makefile可以滥用。它可以节省时间,但请不要使用,除非您只是想进行一次小测试。 你可以

elf=name1 name2 name3 

左右,在一行生成多个elf文件。但在这种情况下,链接器会尝试将所有.o个文件链接在一起,这可能会生成难以理解的错误消息。但无论如何,听起来你只是想要一些小的测试用例,所以......

答案 1 :(得分:3)

如果您正在使用bash(或其他一些Bourne派生的shell),则可以定义shell函数。例如:

gccm() { gcc "$@" -lm; }

别名不能完成这项工作,因为-lm参数必须跟随依赖于数学库的源文件或目标文件的名称。 (-lm参数传递给链接器,链接器跟踪每个文件的未解析引用;这些未解析的引用可以通过以后的参数解析。)

(csh别名比bash别名更强大 - 但是csh没有shell函数。)

请注意,此功能要求您使用其他命令名称。如果要键入gcc并让它使用添加的参数调用gcc命令,则需要做一些额外的工作以避免函数自行调用:

gcc() { command gcc "$@" -lm; }

或:

gcc() { /usr/bin/gcc "$@" -lm; }

command是一个内置的bash,它在绕过任何具有相同名称的shell函数时调用指定的命令。或者您可以指定gcc的完整路径。

创建这样的函数还可以添加更多默认参数。 gcc的默认模式相当宽松,它支持该语言的“gnu90”方言(具有GNU特定扩展名的C90)。您可以指定其他参数来识别更现代的语言版本并执行更多编译时检查:

gcc() { command gcc -std=c99 -pedantic -Wall -Wextra "$@" -lm; }

另一种方法是编写一个包装器脚本并将其放在/usr/bin$PATH之前的目录中,例如$HOME/bin

(某些命令识别隐式添加命令行选项的环境变量;例如GNU grep识别$GREP_OPTIONS。gcc不识别。)

答案 2 :(得分:0)

使用Makefile的另一个可能性是为.bashrc添加别名。在示例中:

$ echo "alias gccm='gcc -lm'" >> ~/.bashrc

然后,在为.bashrc提供资源后,您可以将其用于:$ gccm。但严重的是,你只需要另外3个字符 save