1
#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 来自动链接数学库和我将来使用的任何其他标准库。

这是我正在使用的生成文件:

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

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

4

2 回答 2

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)

编辑

为了清楚起见,.c当没有其他规则与可执行文件匹配时,GNU-make 适用于文件以生成可执行文件的默认规则是:

.c:
         $(CC) $(CFLAGS) $(CPPFLAGS) $(LDFLAGS) $(TARGET_ARCH) $^ $(LOADLIBES) $(LDLIBS) -o $@

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

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

于 2013-08-27T23:28:34.880 回答
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
于 2013-08-27T21:09:42.040 回答