如何使用LDFLAGS在生成文件(How to use LDFLAGS in makefile)

2019-06-18 22:01发布

我是新来的Linux操作系统。 我尝试编译.c使用的makefile文件。 数学库已被链接。 我生成文件看起来是这样的:

CC=gcc
CFLAGS=-Wall -lm

all:client

.PHONY: clean
clean:
    rm *~ *.o client

当我运行make ,我得到以下错误:

"undefined reference to rint"

因此,它是不能够数学库链接。

但是,当我编译明确使用

gcc client.c -lm -o client

它编译成功。

所以,我应该如何改变我的makefile,使得它的工作原理。 我已经尝试添加LDFLAGS=-lm 。 但我得到了同样的错误。

我还要补充一点,当我运行make ,它扩展为

gcc -Wall -lm client.c -o client

(请注意,当我运行gcc有明确-lm末,它的工作原理)。

Answer 1:

链接器(LD)显然不喜欢在使顺序排列GCC参数,所以你必须改变你的Makefile了一下:

CC=gcc
CFLAGS=-Wall
LDFLAGS=-lm

.PHONY: all
all: client

.PHONY: clean
clean:
    $(RM) *~ *.o client

OBJECTS=client.o
client: $(OBJECTS)
    $(CC) $(CFLAGS) $(OBJECTS) -o client $(LDFLAGS)

在限定所述客户对象行改变$根据需要(LDFLAGS)的顺序。



Answer 2:

在更复杂的情景生成,是很常见的打破汇编成阶段,编译和组件发生第一(输出到目标文件),以及目标文件链接成一个最终可执行或库之后 - 这防止不必重新编译的所有对象时,文件他们的源文件都没有改变。 这就是为什么包括链接标志-lm ,当你把它放在不工作CFLAGSCFLAGS在编译阶段使用)。

对被链接库的惯例是将它们放置在任何LOADLIBESLDLIBS (GNU使包括,但您的里程可能会有所不同):

LDLIBS=-lm

这应该允许您继续使用内置的规则,而不是写自己的关联规则。 对于其他品牌,应该有一个标志输出内置规则(GNU做,这是-p )。 如果你化妆的版本不具有连接(或者,如果它不具备一个占位符内置规则-l指令),你需要编写自己的:

client.o: client.c
    $(CC) $(CFLAGS) $(CPPFLAGS) $(TARGET_ARCH) -c -o $@ $<

client: client.o
    $(CC) $(LDFLAGS) $(TARGET_ARCH) $^ $(LOADLIBES) $(LDLIBS) -o $@


Answer 3:

好像链接标志的命令不是在旧版本的GCC的问题。 例如, gcc (GCC) 4.4.7 20120313 (Red Hat 4.4.7-16)自带的CentOS-6.7满意连接选项之前inputfile中; 但GCC与Ubuntu 16.04 gcc (Ubuntu 5.3.1-14ubuntu2.1) 5.3.1 20160413不允许。

它不是单纯的gcc版本,我已经得到的东西与发行版



文章来源: How to use LDFLAGS in makefile