库的顺序和源文件来自makefile



我应该开始说我在GCC和Makefiles方面有点新手。

在我最近开始使用的Ubuntu机器上,我发现运行GCC时,将源文件和库/标题放置的顺序有所不同。在另一台机器上我可以做:

gcc -I../include -L../lib myProgram.c -o myProgram

但是在新机器上,这不会链接库,我必须做:

gcc myProgram.c -o myProgram -I../include -L../lib

现在,我有以下makefile:

SHELL = /bin/sh
CC = gcc -O3
CFLAGS = -I../include
LDFLAGS = -L../lib
PROGS = myProgram
all: $(PROGS)
$(all): $(PROGS).o
        $(CC) -o $@ $@.o $(LIBS) $(CFLAGS) $(LDFLAGS)
        rm -f $@.o
clean:
        rm -f *.o $(PROGS)

但是当我"做"时,它运行的实际GCC命令的库和源文件以错误的顺序。我的问题是:我需要在makefile中做什么才能强制" -l ../libs"选项,以便在源文件之后进行,以便库将正确链接?

我还尝试了包括" -wl, - 不需要"选项,因为我认为 - 需要的标志可能是首先要订单很重要的原因,但是这似乎没有更改任何内容(即,除非" -l ../libs"是源文件之后的(。

问题是您认为自己正在使用该规则,但不是。您从未定义一个名为all的变量,因此第二个规则的目标实际上扩展到 nothing 。当您命令构建myProgram时,在此Makefile中没有找到合适的规则。在这种情况下,Make具有一个隐含规则的工具箱;它想构建myProgram,看到一个名为myProgram.c的文件,其规则之一看起来像这样:

%: %.c
    $(CC) $(LDFLAGS) $^ -o $@

在那里,链接标志在来源之前。

您可以编写自己的模式规则,该规则将使用:

%: %.o
    $(CC) -o $@ $^ $(LIBS) $(CFLAGS) $(LDFLAGS)

(请注意,这是从myProgram.o构建myProgram,让我们弄清楚如何构建myProgram.o。(

如果要从几个对象文件构建您的可执行文件,请添加这样的规则:

myProgram: other.o yetAnother.o

如果您喜欢的话,您可以还有一个规则(第一个(来告诉您要建造的东西:

all: myProgram myOtherProgram friendsProgram

(最终注意:我们都有紧迫的工作截止日期。寻求帮助比学习工具更快,但是学习工具比寻求帮助n时更快。确定n的值您。(

最新更新