我正在编写简单的 makefile 项目。
我尝试分两步构建该程序:
- 编译源文件并将目标文件保存在不同的目录中
- 将对象链接到可执行文件
考虑一些简单的事情,例如:
all:
gcc -o ~/some_dir/main.o -c main.c
ld -o my_program main.o
问题是调用目录不是“~/some_dir”,因此 ld 找不到目标文件...如何在 ld 搜索路径中包含“some_dir”?
从更全局的角度来看,我在各个目录中都有目标文件,我想使用单个链接器命令文件将它们全部链接在一起。
谢谢。
最佳答案
你让事情变得比需要的复杂得多,应该让 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)
中的目标文件。
关于c - 如何链接来自不同目录的对象(运行 ld),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42395212/