我是新来的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
末,它的工作原理)。
链接器(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)的顺序。
在更复杂的情景生成,是很常见的打破汇编成阶段,编译和组件发生第一(输出到目标文件),以及目标文件链接成一个最终可执行或库之后 - 这防止不必重新编译的所有对象时,文件他们的源文件都没有改变。 这就是为什么包括链接标志-lm
,当你把它放在不工作CFLAGS
( CFLAGS
在编译阶段使用)。
对被链接库的惯例是将它们放置在任何LOADLIBES
或LDLIBS
(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 $@
好像链接标志的命令不是在旧版本的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版本,我已经得到的东西与发行版