Gcc makefile中库和源文件的顺序

Gcc makefile中库和源文件的顺序,gcc,makefile,Gcc,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

首先,我应该说,在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)
但是,当我执行make时,它运行的实际gcc命令的库和源文件顺序错误。我的问题是:我需要在makefile中做什么来强制-L../libs选项位于源文件之后,这样库才能正确链接


我还尝试了包括-Wl,-no-as-needed选项,因为我认为-as-needed标志可能是订单最重要的原因,但这似乎没有改变任何东西,即它仍然无法链接库,除非-L../libs位于源文件之后。

问题是,您认为您在使用该规则,但您没有。您从未定义过名为all的变量,因此第二条规则的目标实际上扩展为零。当您命令Make生成myProgram时,Make在此makefile中未找到合适的规则。Make有一个工具箱,在这种情况下可以依靠它;它想要构建myProgram,它看到一个名为myProgram.c的文件,它的一条规则如下所示:

%: %.c
    $(CC) $(LDFLAGS) $^ -o $@
myProgram: other.o yetAnother.o
这样,链接器标志在源之前

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

%: %.o
    $(CC) -o $@ $^ $(LIBS) $(CFLAGS) $(LDFLAGS)
请注意,这将从myProgram.o构建myProgram,并让Make了解如何构建myProgram.o

如果要从多个对象文件生成可执行文件,请添加如下规则:

%: %.c
    $(CC) $(LDFLAGS) $^ -o $@
myProgram: other.o yetAnother.o
如果你喜欢,你可以有一个规则,首先告诉你做你想要的:

all: myProgram myOtherProgram friendsProgram

最后一点:我们都有很紧的工作期限。一次求助可能比学习工具快,但学习工具比N次求助快。确定N的值取决于您。

是否希望-L../libs位于源文件之前?或者是目标文件?对不起,我的意思是-L../libs在源文件和目标文件之后。第二条规则看起来不正确。不要使用$all:$PROGS.o,试试myProgram:myProgram.o,一旦它运行起来,我们就可以担心通用性了。啊哈!虽然我不明白为什么,但这起作用了。$all:$PROGS.o在我以前在另一台机器上编译时起作用。有没有另一种方法可以让我概括出有一些makefile,我想在其中编译多个对象文件?这里有太多的错误和误解,无法合理地接受。因此,在研究您试图使用的工具时,问题不能代替尽职调查。资源:。谢谢我感谢你的解释。这段代码,包括makefile,是我从其他人那里继承的东西,我没有想到他的makefile中可能有错误,我只是假设我不懂的一些语法解释了所有这些。我意识到我应该学习这些工具,但在这种情况下,我迫切需要一个快速的解决方案。谢谢您提供了一个。@StevenLinden:您没有想到您继承的代码可能包含明显的错误?啊,青春。。。