prosource

makefile에 정적 라이브러리를 포함하는 방법

probook 2023. 7. 22. 10:10
반응형

makefile에 정적 라이브러리를 포함하는 방법

나는 다음과 같은 makefile을 가지고 있습니다.

CXXFILES = pthreads.cpp 

CXXFLAGS = -O3 -o prog -rdynamic -D_GNU_SOURCE -L./libmine
LIBS = -lpthread -ldl

all:
    $(CXX) $(CXXFILES) $(LIBS) $(CXXFLAGS)

clean:
    rm -f prog *.o

나는 그것을 포함시키려고 노력하고 있습니다../libmine안에 있는 도서관.CXXFLAGS그러나 정적 라이브러리를 포함하는 것은 올바른 방법이 아닌 것 같습니다. 프로그램을 컴파일할 때 정의되지 않은 참조 오류가 많이 발생하기 때문입니다.그렇다면 정적 라이브러리를 작성 파일에 포함하는 올바른 방법은 무엇일까요?

사용하다

LDFLAGS= -L<Directory where the library resides> -l<library name>

예:

LDFLAGS = -L. -lmine

정적 컴파일을 보장하기 위해 추가할 수도 있습니다.

LDFLAGS = -static

또는 전체 라이브러리 검색을 없애고 직접 연결할 수 있습니다.

있다고 하시오main.c,fun.c정적 라이브러리libmine.a그런 다음 Makefile의 마지막 링크 라인에서 수행할 수 있습니다.

$(CC) $(CFLAGS) main.o fun.o libmine.a
CXXFLAGS = -O3 -o prog -rdynamic -D_GNU_SOURCE -L./libmine
LIBS = libmine.a -lpthread 

다음을 확인합니다.-L옵션이 앞에 나타납니다.-l특히 정적 라이브러리에서는 링커 명령줄의 옵션 순서가 중요합니다.-L옵션은 라이브러리(정적 또는 공유)를 검색할 디렉토리를 지정합니다.-lname옵션은 사용할 라이브러리를 지정합니다.libmine.a(정적) 또는libmine.so(대부분의 유닉스 버전에서 공유되지만 Mac OS X는.dylib그리고 HP-UX를 사용했습니다..sl) 일반적으로 정적 라이브러리는 파일에 있습니다.libmine.a이것은 관례이며, 필수 사항은 아니지만, 이름이 다음에 없는 경우.libmine.a포맷, 당신은 사용할 수 없습니다.-lmine컴파일러(링커) 명령줄에 명시적으로 나열해야 합니다.

-L./libmine옵션은 "라고 하는 하위 디렉터리가 있습니다.libmine라이브러리를 찾기 위해 검색할 수 있습니다."저는 세 가지 가능성을 볼 수 있습니다.

  1. 다음을 포함하는 하위 디렉터리가 있습니다.libmine.a이 경우에도 추가해야 합니다.-lmine링커 라인으로 이동합니다(라이브러리를 참조하는 개체 파일 뒤).
  2. 파일이 있습니다.libmine그것은 정적 아카이브이며, 이 경우 당신은 단순히 파일로 나열합니다../libmine없는-L맨 앞에
  3. 파일이 있습니다.libmine.a선택하려는 현재 디렉터리에 있습니다.당신은 글을 쓸 수 있습니다../libmine.a또는-L . -lmine그리고 둘 다 도서관을 찾아야 합니다.

-L단지 찾을 수 있는 길을 제공할 뿐입니다..a또는.so파일입니다. 당신이 찾고 있는 것은 추가하는 것입니다.-lmine에게LIBS변수.

그렇게 해주세요-static -lmine(정적 라이브러리와 동적 라이브러리가 모두 존재하는 경우) 정적 라이브러리를 선택하도록 강제합니다.

추가:파일의 경로가 다음을 통해 링커(또는 컴파일러 드라이버)로 전달되었다고 가정합니다.-L당신은 또한 링크하라고 구체적으로 말할 수 있습니다.libfoo.a-l:libfoo.a이 경우 이름에 관례가 포함된다는 점에 포함됩니다.lib -네이러한 방식으로 전체 경로를 지정할 수도 있습니다.때때로 이것은 링커를 올바른 위치로 "안내"하는 더 나은 방법입니다.

언급URL : https://stackoverflow.com/questions/11344965/how-to-include-static-library-in-makefile

반응형