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

标签 c gcc makefile gnu ld

我正在编写简单的 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”?

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

谢谢。

最佳答案

你让事情变得比需要的复杂得多,应该让 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/

相关文章:

c - 为什么堆栈上溢/下溢不会触发运行时错误?

c - 为什么将这些宏函数转换为函数不能正常工作?

c - 如何清除保存内存位置起始位置的指针变量,该变量需要从起始位置清除 20 个字节的数据

在运行时更改库加载顺序(如 LD_PRELOAD 但在执行期间)

makefile - 获取 GNU make 中文件夹的基本名称

linux - 返工查找命令以使用其他扩展

c - Makefile 不会在 header 修改时重建对象

gcc - 哪个内联汇编代码对于 rdtscp 是正确的?

c - 如何在必须只定义一次的函数或宏函数中创建变量?

android - 3.4源码编译错误: fields must have a constant size: 'variable length array in structure' extension will never be supported on android 2.