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

C 如何链接不同目录中的对象(运行ld),c,gcc,makefile,gnu,ld,C,Gcc,Makefile,Gnu,Ld,我正在写一个简单的makefile项目 我试着分两步构建程序: 编译源文件并将目标文件保存在其他目录中 将对象链接到可执行文件中 考虑一些简单的事情,比如: all: gcc -o ~/some_dir/main.o -c main.c ld -o my_program main.o 问题是调用目录不是“~/some\u dir”,因此ld找不到目标文件。。。如何在ld搜索路径中包含“some_dir” 从更全局的角度来看,我在不同的目录中有对象文件,我希望使用单个链接器命令

我正在写一个简单的makefile项目

我试着分两步构建程序:

  • 编译源文件并将目标文件保存在其他目录中
  • 将对象链接到可执行文件中
  • 考虑一些简单的事情,比如:

    all:
        gcc -o ~/some_dir/main.o -c main.c 
        ld -o my_program main.o
    
    问题是调用目录不是“~/some\u dir”,因此ld找不到目标文件。。。如何在ld搜索路径中包含“some_dir”

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


    谢谢。

    你让事情变得比需要的复杂得多,应该让
    为你做更多的工作。下面是您重新编写的简单示例

    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)
    来定义它们是
    myu程序的依赖项。make规则中的$@是一个变量,表示“我们正在构建的东西”,而$^是依赖项列表。您可以将其他依赖项添加到
    my_程序
    ,而无需更改正在运行的命令


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

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