是否有办法将'-lm'设置为GCC的默认值?

mwkjh3gx  于 2022-11-12  发布在  其他
关注(0)|答案(3)|浏览(200)

背景:我最初是在1990年在DOS 6上用TurboC学习C语言的;有很多东西Turbo C认为是标准的,但显然不是(即使在那时)。
现在我正在通过“88 C程序”来刷新自己。我发现当我需要在GCC上使用math.h中的函数时(如sqrt()log10()等),我不得不手动链接数学库,方法是在GCC命令的末尾追加-lm。(比方说,使用一个环境变量),这样,如果我有#include "math.h",我会自动将-lm添加到编译命令中,而不必记住键入它?
作为一个四核CPU上的单个用户,我并不担心微小的性能差异。
潜在重要性:我使用的GCC版本及其依赖项可以在Ubuntu存储库中找到,在Kubuntu 14.04上。
有没有办法将-lm设置为GCC的默认值?

pgccezyw

pgccezyw1#

如果你使用的是Bash(或其他Bourne派生的shell),你可以定义一个shell函数。

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

别名不能完成这项工作,因为-lm参数必须 * 跟随 * 依赖于数学库的源文件或目标文件的名称。(-lm参数被传递给链接器,链接器跟踪每个文件的未解析引用;那些未解析的引用可以由后面的参数来解析。)
C shellcsh)别名比Bash别名的功能稍强一些,但C shell没有shell函数。)
请注意,这个函数要求您使用不同的命令名。如果您想输入gcc并让它调用带有附加参数的gcc命令,您需要做一些额外的工作以避免函数调用自身:

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

或:

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

command是一个Bash内置函数,它可以调用指定的命令,同时绕过任何同名的shell函数。或者,您可以指定gcc的完整路径。
gcc的默认模式是相当宽松的,并且它支持gnu 90语言的方言(带有GNU特定扩展的C89)。您可以指定额外的参数来识别更现代的语言版本,并执行更多的编译时检查:

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

另一种方法是编写一个 Package 器脚本,并将其放在$PATH/usr/bin之前的目录中,例如$HOME/bin
(Some命令识别隐式添加命令行选项的环境变量;例如,GNU grep可以识别$GREP_OPTIONS,而gcc则不能。)

g6ll5ycj

g6ll5ycj2#

我建议你写一个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文件链接在一起,这可能会生成难以理解的错误信息。但无论如何,听起来你只是想要一些小的测试用例,所以...

f8rj6qna

f8rj6qna3#

使用Makefile的另一种可能性是在.bashrc文件中添加别名。

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

然后,在为 .bashrc 文件提供资源后,您可以将其用于:gccm。但说真的,你只需要再 * 保存 * 三个字符。

相关问题