如何链接来自不同目录的对象(运行ld)

时间:2017-02-22 15:08:25

标签: c gcc makefile gnu ld

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

我试图分两步建立程序:

  1. 编译源文件并将目标文件保存在不同的目录中
  2. 将对象链接到可执行文件
  3. 考虑一些简单的事情:

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

    问题是调用目录不是"〜/ some_dir"所以ld找不到目标文件......我怎样才能包含" some_dir"在ld搜索路径?

    从更全局的角度来看,我在各种目录中都有目标文件,并且我希望使用单个链接器命令文件将它们全部链接在一起。

    感谢。

1 个答案:

答案 0 :(得分:0)

你的事情比他们需要的要复杂得多,应该让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)中的目标文件是如何从当前目录中的源文件构建的。