当前位置: 首页 > 知识库问答 >
问题:

来自makefile的库和源文件的顺序

谭曦
2023-03-14

首先,我应该说,在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-需要"选项,因为我认为--as-需要标志可能是顺序首先重要的原因,但这似乎没有改变任何事情(即它仍然无法链接库除非"-L.../libs"在源文件后面)。

共有1个答案

裴鸿熙
2023-03-14

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

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

这样,链接器标志在源之前。

您可以编写自己的模式规则,让它代替:

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

(请注意,这将从myProgram.o构建myProgram,并让Make了解如何构建myProgram.o

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

myProgram: other.o yetAnother.o

如果你喜欢,你可以有一个更多的规则(第一)告诉让你想要建立什么:

all: myProgram myOtherProgram friendsProgram

(最后一点注意:我们的工作期限都很紧。请求帮助一次可能比学习工具快,但学习工具比请求帮助快N次。N的值取决于你。)

 类似资料:
  • 嘿,我想从文件中添加一些自定义字体。 这些是我要加载的字体文件。 我的索引.css 提前致谢

  • 出于某种原因,我一直在GradleJavaFX项目中获得NPE。 我的文件夹结构非常基本。我在文件夹中有一个包含java文件的包。我的资源也在文件夹中。当我尝试加载它给了我一个NPE。 这是一个助手类。 从我调用:

  • 问题内容: 我有一个目录结构如下的项目: 我应该如何编写一个可以在part / src中(或在任何地方)的makefile来在部分c / c ++源文件中完成/链接?/ src? 我可以做一些事情-I $ projectroot / part1 / src -I $ projectroot / part1 / inc -I $ projectroot / part2 / src … 如果那行得通,

  • 来自数据库表的REST资源 我最近学习了一些关于REST的东西(其中许多我部分理解)。我也做了一些简单的演示,这些演示不是很rest,但至少我尝试了一些resting的东西。但是,当涉及到从零开始开发一些真实世界的应用程序时,我就笨手笨脚了。 null 这个问题是我之前关于如何基于一些表以restful方式决定资源的问题的延续 请不要说没有这样规定的标准。应该有一个:。我只是要求一个方法…只是一些

  • 详细内容请看这里

  • 我想做一个条形图,使用gnuplod3列的值,xtic标签从第2列,颜色从我的数据文件的第4列。该文件看起来像: 目前,我使用以下命令绘制, 绘图在x轴上有正确的tic标签,所有的条都是红色的。我想做的是从文件中获得条形图的颜色,或者有一个从蓝色到红色的平滑调色板,穿过白色。 我尝试了很多不同的建议,在网上搜索时发现了这些建议,但都没有成功。我该怎么做?