#include <stdio.h>
#include <math.h>
int main(void)
{
double test=23.4;
test=sqrt(test);
printf("%f",test);
}
为了编译这个,我使用: gcc -o test test.c -L / path / to / libs -lm
然而,我想使用我的makefile来自动链接数学库和我将来使用的任何其他标准库。
这是我正在使用的makefile:
CC=gcc
CFLAGS=-Wall
LDFLAGS=-lm
OBJECTS=client.o
SOURCE=client.c
client: $(OBJECTS)
$(CC) $(CFLAGS) $(OBJECTS) -o client $(LDFLAGS) $(LIBS)
all:client
.PHONY: clean
clean:
rm -f *~ *.o client
如何修改此makefile以自动链接库?
答案 0 :(得分:2)
从另一个答案的评论中,您似乎正在使用make test
构建一个与makefile中指定的程序不同的程序(当您输入make
时获得的程序)如果您想要要使用,您需要为默认规则使用正确的变量名称:
CC=gcc
CFLAGS=-Wall
LDFLAGS=-L/path/to/libs
LDLIBS=-lm
只有你的makefile中的那个,你可以使用make test
将test.c编译成一个名为test的可执行文件(或make client
来编译client.c。)
如果要将多个文件编译为单个可执行文件,则需要在makefile中添加规则(但使用标准变量名称):
OBJECTS=client.o otherfile.o extra.o
client: $(OBJECTS)
$(CC) $(LDFLAGS) -o $@ $^ $(LDLIBS)
修改强>
为了清楚起见,当没有其他规则与可执行文件匹配时,GNU-make的默认规则适用于.c
文件以生成可执行文件:
.c:
$(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH) $^ $(LOADLIBES) $(LDLIBS) -o $@
其他版本的make做类似的事情($(TARGET_ARCH)
和$(LOADLIBES)
特定于GNU make;许多品牌也没有$(CPPFLAGS)
)。您可以通过在没有Makefile的目录中运行make -p
来查看默认规则集。
如果您愿意,您可以使用Makefile中的不同内容替换上述模式规则,在这种情况下,make将执行您要求它执行的任何操作。
答案 1 :(得分:0)
CC=gcc
CFLAGS=-Wall
LDFLAGS=-lm
LIBPATH=-L/path/to/libs
OBJECTS=client.o
SOURCE=client.c
client: $(OBJECTS)
$(CC) $(CFLAGS) $(OBJECTS) -o client $(LIBPATH) $(LDFLAGS) $(LIBS)
all:client
.PHONY: clean
clean:
rm -f *~ *.o client