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
라이브러리를 찾기 위해 검색할 수 있습니다."저는 세 가지 가능성을 볼 수 있습니다.
- 다음을 포함하는 하위 디렉터리가 있습니다.
libmine.a
이 경우에도 추가해야 합니다.-lmine
링커 라인으로 이동합니다(라이브러리를 참조하는 개체 파일 뒤). - 파일이 있습니다.
libmine
그것은 정적 아카이브이며, 이 경우 당신은 단순히 파일로 나열합니다../libmine
없는-L
맨 앞에 - 파일이 있습니다.
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
'prosource' 카테고리의 다른 글
gcc, 엄격한 별칭 지정 및 조합을 통한 캐스팅 (0) | 2023.07.22 |
---|---|
Spring Boot 플러그인을 사용하려면 Gradle 4.10 이상이 필요합니다.현재 버전은 Gradle 4.1입니다. (0) | 2023.07.22 |
리눅스에서 C/C++로 사용자 이름을 얻는 방법은 무엇입니까? (0) | 2023.07.17 |
gitignore에 .gitignore 추가 (0) | 2023.07.17 |
스프링 부트: accessDeniedHandler가 작동하지 않습니다. (0) | 2023.07.17 |