【问题标题】:How to link objects from different directory (running ld)如何链接来自不同目录的对象(运行 ld)
【发布时间】:2017-07-12 17:19:49
【问题描述】:

我正在编写简单的 makefile 项目。

我正在尝试分两步构建程序:

  1. 编译源文件并将目标文件保存在不同的目录中
  2. 将对象链接到可执行文件中

考虑一些简单的事情,例如:

all:
    gcc -o ~/some_dir/main.o -c main.c 
    ld -o my_program main.o

问题是调用目录不是“~/some_dir”,所以 ld 找不到目标文件...如何在 ld 搜索路径中包含“some_dir”?

从更全局的角度来看,我在不同的目录中有目标文件,我想使用一个链接器命令文件将它们链接在一起。

谢谢。

【问题讨论】:

  • 嗯,通过指定要链接的对象的可用路径? 否则你会怎么做?但无论如何,通常最好使用gcc 作为链接器驱动程序,而不是直接调用链接器:gcc -o my_program ~/some_dir/main.o
  • 另外,与其使用绑定到当前用户主目录 (~/some_dir) 的路径,不如将构建文件放在与构建工作目录相关的位置,并找到源相对于包含 Makefile 的目录的文件。

标签: c gcc makefile gnu ld


【解决方案1】:

您正在使事情变得比需要的复杂得多,应该让make 为您完成更多工作。以下是您重写的简单示例

SRCS=main.c
BUILDDIR=~/somedir
OBJS=$(SRCS:%.c=$(BUILDDIR)/%.o)
CFLAGS=-g

all: my_program

my_program: $(OBJS)
        $(CC) $(CFLAGS) -o $@ $^

$(BUILDDIR)/%.o: %.c
        $(CC) $(CFLAGS) -c -o $@ $^

它在顶部定义了许多变量,例如 SRCS,它将包含您的源文件列表、您存储目标文件的目录并生成您将构建的目标文件的列表。然后它使用$(OBJS) 来定义它们是my_program 的依赖项。 make 规则中的 $@ 是一个变量,意思是“我们正在构建的东西”,而 $^ 是依赖项列表。您可以在my_program 中添加其他依赖项,无需更改正在运行的命令。

然后有一条规则定义$(BUILDDIR) 中的目标文件如何从当前目录中的源文件构建。

【讨论】:

    猜你喜欢
    • 2011-07-25
    • 1970-01-01
    • 2020-12-15
    • 1970-01-01
    • 2016-03-11
    • 2018-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多