2013-08-27 20 views
1
#include <stdio.h> 
#include <math.h> 

int main(void) 
{ 
    double test=23.4; 
    test=sqrt(test); 
    printf("%f",test); 
} 

为了编译这个我用: 的gcc -o测试test.c的-L /路径/要/库-lm如何让我的makefile自动链接库?

不过,我想用我的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 

如何修改此生成的文件,以便自动链接库?

+1

你是什么意思的“自动”? 'make'根本不理解C或链接过程,它只是处理你给它的规则。 – Mat

+0

有趣的是,Plan 9如何定义每个头文件使用的编译指示,这正是您想要的。 – fuz

+0

对不起,但我不认为我解释得很好,我刚刚开始学习C。我不想输入gcc -o test test.c -L/path/to/libs -lm everythime我使用库。有没有办法可以更改makefile,以便它可以执行所有gcc -o test test.c -L/path/to/libs -lm? –

回答

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 
+0

当我使用它时,即使它应该工作也会收到一条错误消息:/tmp/cc3kJ0AG.o:在函数'主'': test.c :(。text + 0x24):未定义引用'sqrt' collect2:错误:ld返回1退出状态 make:*** [test]错误1 –

1

从对方的回答的意见,看来你正在使用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 [email protected] $^ $(LDLIBS) 

编辑

需要说明的是,当没有其他规则匹配可执行文件时,GNU-make默认的规则适用于.c文件以生成可执行文件:

.c: 
     $(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH) $^ $(LOADLIBES) $(LDLIBS) -o [email protected] 

其他版本的make可以做类似的事情($(TARGET_ARCH)$(LOADLIBES)特定于GNU make;很多人也没有$(CPPFLAGS))。您可以通过在没有Makefile的目录中运行make -p来查看默认规则集。

如果你愿意,你可以用Makefile中不同的东西来替换上面的模式规则,在这种情况下,make会做你告诉它做的任何事情。

+0

您是对的。我以某种方式认为makefile会将这些规则应用于任何扩展名为.c的文件。我将makefile中的每个“客户端”实例都更改为“test”,并且工作正常。 –

+0

@HarshpreetSingh:它会将其规则应用于任何扩展名为.c的文件,只是它应用的规则与makefile中的“客户端”规则不完全匹配。 –