2017-02-22 7 views
-1

간단한 makefile 프로젝트를 작성하고 있습니다.다른 디렉토리에서 객체를 연결하는 방법 (ld 실행)

내가 두 단계에서 프로그램을 구축하기 위해 노력하고있어 :

뭔가를 생각하는 실행 내로 다른 디렉토리에

  • 링크 개체를 오브젝트 파일을

    1. 컴파일 소스 파일 저장 다음과 같이 간단하게 :

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

      문제는 직접 호출입니다. ry가 "~/some_dir"이 아니므로 ld가 오브젝트 파일을 찾지 못했습니다 ... 어떻게 ld 검색 경로에 "some_dir"을 포함시킬 수 있습니까?

      더 많은 글로벌 관점에서 볼 때 여러 디렉토리에 개체 파일이 있으며 단일 링커 명령 파일을 사용하여 개체 파일을 모두 연결하고 싶습니다.

      감사합니다.

  • +0

    음, 링크 할 개체에 사용할 수있는 경로를 지정 하시겠습니까? 어떻게 * 다른 * 당신은 그것을 할 것입니까? 그러나 주위에 어떤 식 으로든 일반적으로 링커를 직접 호출하는 대신 gcc를 링커 드라이버로 사용하는 것이 가장 좋습니다 : gcc -o my_program ~/some_dir/main.o'. –

    +0

    또한 현재 사용자의 홈 디렉토리 ('~/some_dir')에 연결된 경로를 사용하는 대신 빌드를위한 작업 디렉토리에 상대적인 위치에 빌드 파일을 넣고 디렉토리에 상대적인 소스 파일을 찾는 것이 훨씬 현명합니다 Makefile을 포함하고있다. –

    답변

    0

    당신이해야 할 것들보다 훨씬 복잡한 것들이 있으니 make이 더 많은 일을 할 수 있도록해야합니다. 아래는 간단한 예는 재 작성 그것은, 당신은 오브젝트 파일을 저장하고 발생하고있는 디렉토리를 소스 파일의 목록을 포함 것 같은 SRCS 등의 상단에 변수의 수를 정의

    SRCS=main.c 
    BUILDDIR=~/somedir 
    OBJS=$(SRCS:%.c=$(BUILDDIR)/%.o) 
    CFLAGS=-g 
    
    all: my_program 
    
    my_program: $(OBJS) 
         $(CC) $(CFLAGS) -o [email protected] $^ 
    
    $(BUILDDIR)/%.o: %.c 
         $(CC) $(CFLAGS) -c -o [email protected] $^ 
    

    한다 빌드 할 오브젝트 파일의 목록. 그런 다음 $(OBJS)을 사용하여 종속성이 my_program임을 정의합니다. make 규칙에서 $ @는 "우리가 만들고있는 것"을 의미하는 변수이고 $ ^는 종속성 목록입니다. my_program에 다른 종속성을 추가 할 수 있으며 실행중인 명령을 변경할 필요가 없습니다.

    그런 다음 $(BUILDDIR)의 오브젝트 파일이 현재 디렉토리의 소스 파일에서 빌드되는 방법을 정의하는 규칙이 있습니다.