리눅스 - 해당되는 글 36건

다수의 소스 파일로 구성된 큰프로그램중 어떤파일이 변경되어 재 컴파일이 필요한지
판단해서 프로그램 재구성작업을 효율적을 수행하는 역할을 한다.
make는 수정된것을 안다 수정시간등으로 그래서 수정된 파일만 컴파일을 해준다.
예를 들어서  a.0의 수정시간보다 a.c 의 수정시간이 최신이면 다시 컴파일을 해준다.

make파일의 기본적인 형태
먼저 타겟을 적는다 예를 들어서 컴파일을 해서 Test라는 실행 파일을만들고 싶으면
Test 가 make에들어간다.
예) make test a.c b.c c.c
 여기 한줄아래 대상파일을 실행하기 위한 명령을 아래적는다
 위에 공백은 탭키로 해야지만 위에 줄이 명령이라고 인식한다.
예)
test:: test.c
 gcc test.c -o test
clean:                                            => make clean이라는 명령을 주었을때 이것이 실행이된다. 쉽게 말해서 라벨을 찾아서  실행명령을 수행한다.
 rm test.o
======================
의존성
대상과 대상을 생성하는데 필요한 소스 파일의 관계

사용자 삽입 이미지

사용자 삽입 이미지

test::test test1.o test2.o test3.o
test1.o:test1.c a.h
test2.o:test2.c.a.h b.h
test3.o:test3.c b.h c.h
보통 이런식으로 해줘야 다시 재빌드 하는 작업이 줄어든다.
test 1,2,3은 아래 파일에 의해서 만들어지고 test는 test1.o test2.o test3.o 에 의해서 만들어진다.
test: test1.o test2.o test3.o
 gcc -o test test1.o test2.o test3.o
test1.o: test1.c a.h
 gcc-c test1.c
test2.o: test2.c a.h b.h
 gcc -c test2.c
test3.o: test3.c b.h c.h
 gcc -c test3.c
-----------------------------------------------------
make
치면 지가알아서 컴파일
메이크파일은 Makefile이렇게 첫문자를 항상대문자로 만들어야한다.
긴명령을 쓸려면 깔끔하게 보이게 \을 사용해도된다.
test: test1.o \
 test2.o\
 test3.o\
 test4.o\
이런식으로 써도 된다.
------------------------------------------------------------------------------------------------
셸에서는 ;을 사용해서 깔끔하게 보이게 쓸수도 있다.
-------------------------------------------
매크로정의
M_NAME = value
사용할땐 $(M_NAME)

매크로 치환
OBJF=test1.o test2.o test3.o
SRCS=$(OBJF:.o=. c)
-----------------------------------------------------------------------------------------------------------------------
암시적인 규칙을이용한다.
01 OBJF = test1.o test2.o test3.o
02 test: $(OBJF)
03 ??gcc -o $@ $(OBJF)
04 clean:
05 ??rm $(OBJF)

      리눅스  |  2007. 9. 11. 18:05




1.ar r mylib.a *.o 오브젝트 파일을 하나로 묶는다
   ls해보면 mylib이라는 파일이 생겨버렸다.
   .a파일을 만들어서 정적라이브러리로 만들어서 쓸수 있다.

사용자 삽입 이미지

1

2.실행해보면 실행된다.
사용자 삽입 이미지

2


3.되는거 알았으니까 오브젝트 파일 지우고 ls해서 보면 지워져있다.
     그리고 gcc -fPIC -c minus.c plus.c 오브젝트 파일을 생성한다.
     cc1 컴파일러에게 위치(메모리)에 관계 없이 수행되는 코드로 컴파일 하라는 옵션
     파일이 어떻게 돌아갈지 모르기때문에
사용자 삽입 이미지

3

4.gcc -shared -Wl,-soname,libmy.so.0 -o libmy.so.0.0.0 *.o
         -shared : shared object를 생성하라는 옵션
         -Wl: -Wl옵션 뒤에 오는 옵션 들을 링커에게 바로 전달하라는 옵션
         -soname,libmy.so.0 : 동적 링커에게 soname libmy.so.0와 같은 형식으로 바로 전달
   주의 해야 할점은 띄어쓰기를 제대로 해야된다.제대로 안하면 아래처럼 에러다
사용자 삽입 이미지

4

5.카피해서 /usr/lib에 복사하려고했으나 이름이 계속있어서 여기에서 그냥 다시 이름을 바꺼서 만들었다.
   libtest.so.0.0.0 으로
   ln -s /usr/lib/libtest.so.0.0.0을  /usr/lib/libtest.so.0으로 심볼릭 링크를한다.
    --> 동적 링크를 위한 파일
   ln -s /usr/lib/libtest.so.0.0.0을  /usr/lib/libtest.so으로 심볼릭 링크를한다.\
   --> gcc 링크를 위한파일
   전에 만든 rm libmy.so.0.0.0은 안쓰는거니까 파일을 정리하는 차원에서 지워준다.
   만든 라이브러리 사용하기 (.a와 .so가 둘 다 있으면 .so를 선택)
   gcc test.c -ltest -o test  
사용자 삽입 이미지

5

6. 컴파일했으니까 되나 실험해보면된다.
    gcc test.c mylib.a -o test_s 라이브러리를 이용해서 컴파일하면 실행 파일이 아래와 같이 test_s로 출력
사용자 삽입 이미지

6

7.gcc test.c mylib.a -o test_s -static을 사용해서  파일을 만들어서 보면  정적으로 모든 파일을
   다 컴파일 해버려서 용량이 커진것을 볼수있다.
사용자 삽입 이미지

7

 



      리눅스  |  2007. 9. 6. 12:10




------------------------------------------------------------------------------------------------
 정적 라이브러리
    장점
    컴파일 하는 경우 속도가 빠름
   단점
   사이즈가 큼
동적 라이브러리
  장점
   사이즈가 작음
   단점
   컴파일 하는 경우 속도가 느림
  바이너리를 배포할 때 컴파일 할 당시에 사용한 공유 라이브러리와 같은 메이저 버전을 가지고 공유 라이브러리가 있는 시스템에서만 동작 함
---------------------------------------------------------------------------------------------------------------
 공유 라이브러리의 추가 장점
 라이브러리 변경 시 정적 라이브러리는 컴파일한 모든 파일들을 바꾸어야 하지만 공유 라이브러리는 공유 라이브러리만 바꾸어 주면 된다.
 이유 : 공유 라이브러리는 실행 시 공유 라이브러리와 링크 되기 때문
---------------------------------------------------------------------------------------------------------------
오브젝트 만들기
 gcc -fPIC -c plus.c minus.c
-fPIC : cc1 컴파일러에게 위치(메모리)에 관계 없이 수행되는 코드로 컴파일 하라는 옵션
 파일이 어떻게 돌아갈지 모르기때문에
---------------------------------------------------------------------------------------------------------------
라이브러리 만들기 (인덱스 과정 불필요)
 gcc -shared -Wl,-soname,libmy.so.0 -o libmy.so.0.0.0 plus.o minus.o
-shared : shared object를 생성하라는 옵션
-Wl: -Wl옵션 뒤에 오는 옵션 들을 링커에게 바로 전달하라는 옵션
-soname,libmy.so.0 : 동적 링커에게 soname libmy.so.0와 같은 형식으로 바로 전달
---------------------------------------------------------------------------------------------------------------
라이브러리를 만든 후 libmystuff.so.0.0.0의 심볼릭 링크를 만들기
ln -s libmy.so.0.0.0 libmy.so.0   
     --> 동적 링크를 위한 파일
ln -s libmy.so.0.0.0 libmy.so      
     --> gcc 링크를 위한 파일
---------------------------------------------------------------------------------------------------------------
동적 링커(/lib/ld-linux.so.2)가 찾을 수 있도록 디렉토리 설정하기
/etc/ld.so.conf 파일을 열어 libmy.so.0.0.0 파일이 있는 디렉토리를 추가한다.
/etc/ld.so.conf에 지정된 디렉토리를 찾아 다니면서 새로운 심볼릭 링크를 만들고 동적 링커가 읽어 들이는 /etc/ld.so.cache 파일을 새로 갱신한다.
ldconfig
/usr/lib 디렉토리에 만든 라이브러리를 복사하면 위의 절차는 필요가 없다.
---------------------------------------------------------------------------------------------------------------
만든 라이브러리 사용하기 (.a와 .so가 둘 다 있으면 .so를 선택)
 gcc -o 16_9 16_9.c -lmy -L.


      리눅스  |  2007. 9. 6. 11:07



sokoban's Blog is powered by Daum & Tattertools