programing

makefile에서 -I와 -L의 차이점은 무엇입니까?

itsource 2021. 1. 18. 07:59
반응형

makefile에서 -I와 -L의 차이점은 무엇입니까?


makefile에서 -I 및 -L 플래그의 사용법은 무엇입니까?


이들은 일반적으로 링커 명령 줄의 일부이며 대상 작업에서 직접 제공되거나 make링크 명령을 형성하도록 확장 되는 변수에 더 일반적으로 할당됩니다 . 이 경우 :

-L라이브러리가 포함 된 디렉토리의 경로입니다. 라이브러리의 검색 경로입니다.

-l 링크하려는 라이브러리의 이름입니다.

예를 들어 라이브러리에 연결 ~/libs/libabc.a하려면 다음을 추가합니다.

-L$(HOME)/libs -labc

연결에 대한 기본 암시 적 규칙을 활용하려면 다음 LDFLAGS과 같이 변수에 이러한 플래그를 추가합니다 .

LDFLAGS+=-L$(HOME)/libs -labc

그것은 분리하는 것은 좋은 습관입니다 LDFLAGSLIBS예를 들어,

# LDFLAGS contains flags passed to the compiler for use during linking
LDFLAGS = -Wl,--hash-style=both
# LIBS contains libraries to link with
LIBS = -L$(HOME)/libs -labc
program: a.o b.o c.o
        $(CC) $(LDFLAGS) $^ $(LIBS) -o $@
        # or if you really want to call ld directly,
        # $(LD) $(LDFLAGS:-Wl,%=%) $^ $(LIBS) -o $@

그것은 다른 일을 할 수있다하더라도, -l...지시어를 이동 해야하는 후에 그 문자를 참조하는 객체. -Wl,--as-needed링크가 잘못된 순서로 수행되면 일부 최적화 ( 가장 명백한 것임)가 실패합니다.


실제로 메이크 파일을 작성하려면 프로젝트 도구 체인의 모든 구성 요소에 대한 명령 줄을 잘 이해해야합니다. 옵션 좋아 -I하고 -L메이크업 자체가 이해되지 않습니다. 오히려 make는 도구를 실행하여 전제 조건 파일을 대상 파일로 변환하는 명령 줄을 만들려고합니다.

종종 이것은 C 또는 C ++ 소스 파일이 오브젝트 파일로 컴파일되고 결국 실행 파일을 얻기 위해 링크됩니다.

이 경우 컴파일러 설명서, 특히 이해하는 명령 줄 옵션과 관련된 부분을 참조해야합니다.

일반적인 용어로 말하면 이러한 특정 옵션은 컴파일러와 링커 사이에서 꽤 표준입니다. -I#include줄에 이름이 지정된 파일에 대해 컴파일러 -L가 검색 한 위치 목록에 디렉토리를 추가하고 -l옵션으로 이름이 지정된 라이브러리에 대해 링커가 검색 한 위치 목록에 디렉토리를 추가합니다 .

결론은 (일반적으로하는 것으로 알려져으로 메이크의 "언어", 쉘을 메이크 파일 자체의 문법의 조합이다 /bin/sh또는 뭔가 비슷한), 일반 쉘 명령 (예 rm, cp, install, 등) 컴파일러 및 링커에 특정한 명령 (예 : gcc -v --help쉘 프롬프트에 입력 하면 gcc가 하나의 시작점으로 이해하는 옵션의 거의 완전한 (그리고 매우 긴) 목록을 제공합니다).


한 가지 주목할 점은 이것이 컴파일러 / 링커에 전달되는 옵션이라는 것입니다. 따라서 그들의 역할을 알기 위해 컴파일러 man 페이지 / 문서를보고 있어야합니다.

참조 URL : https://stackoverflow.com/questions/519342/what-is-the-difference-between-i-and-l-in-makefile

반응형