GIT 사용 방법

  1. 깃허브 레포지토리 들어가서 code 주소 복사
  2. 우분투 터미널에서 git clone 치고 붙여넣기

리눅스 라이브러리

  • 리눅스 라이브러리 중요
  • 정적 라이브러리 , 동적 라이브러리 차이

하드링크, 심볼릭링크

리눅스에 링크 설정은 하드링크와 심볼링 링크 두 가지가 존재함

링크 사용에는 리눅스 파일 시스템의 자료구조 중 inode 정보에 대한 이해가 필요
파일을 생성하면, inode가 i-list 안에 기록되어 inode의 inumber와 파일 이름이 디렉토리에 등록됌

  • inode
    정의 : Kernel이 관리하고 있는 파일을 위한 메타 데이터
    사용자는 file 명을 가지고 파일을 액세스 하려고 하면, 내부적으로는 파일이름과 맵핑된 inode 번호로 맵핑된다.

  • inode가 가진 정보
    1) 파일 모드(퍼미션)
    2) 링크 수
    3) 소유자명
    4) 그룹명
    5) 파일크기
    6) 마지막 접근 정보
    7) 마지막 수정 정보
    8) 아이노드 수정 정보

  • 하드링크

하드링크는 원본 파일의 inode의 위치를 가르킨다. 파일명만 다르지 사실상 하드링크, 원본파일을 구분할 수 없다.
(원본과 복사본의 차이가 없다)

왜냐하면 파일 시스템에 있는 데이터를 복사한 것이 아니라, inode 번호만 복사했기 때문이다. 따라서 실제 파일은 1개만 존재하는 셈이 된다.

  • 소프트링크

윈도우 시스템에서 제공하는 바로가기 기능과 매우 유사.

원본 파일에 대한 정보가 포함되어 있지 않고, 원본 파일 위치에 대한 포인터만 포함한다. 즉 새로운 inode를 가진 링크파일이 생성된다.

make - gcc 컴파일

user@linux:~/Desktop/elp/lab03_mylib$ make
gcc -g -Ilib -c -o hello.o hello.c
gcc -o hello hello.o -Llib -lmyfunc

방법)
gcc [옵션][파일명]
[옵션]
-c : 링크를 실행하지 않고, 컴파일와 어셈블리만 수행한다.
-o : 처음부터 끝까지 컴파일, 어셈블리, 링크를 수행 후, 실행파일을 만든다.
-v : gcc의 버전정보를 알 수 있다.

공유 라이브러리 사용하기

  1. LD.LIBRARY_PATH 환경변수
    user@linux:~/Desktop/elp/lab03_mylib$ export LD_LIBRARY_PATH=${PWD}
  2. /etc/ld.so.conf 환경파일
    1. user@linux:~/Desktop/elp/lab03_mylib$ sudo vim /etc/ld.so.conf
    include /etc/ld.so.conf.d/*.conf
    /home/user/Desktop/elp/lab03_mylib/lib
    vi들어가서 적고 나오기
    sudo ldconfig
    설정 로드시키기
  3. /usr/local/lib 라이브러리 경로에 파일 복사
    user@linux:~/Desktop/elp/lab03_mylib$ sudo cp lib/libmyfunc.so.1 /usr/lib

공유 라이브러리, c파일 - 컴파일

  1. subl ./ 해서 편집기에서 코드 수정
  2. lib makefile 안에 libmyfunc.so 블록에 sudo cp 코드 추가
    libmyfunc.so : (OBJS) $(CC) -shared -Wl,-soname,@.1 -o $@.1 $(OBJS)
    ln -s $(TARGET).1 $(TARGET)
    sudo cp $@ $@.1 /usr/lib
  3. 공유 라이브러리 컴파일
    user@linux:~/Desktop/elp/lab03_mylib$ make -C lib clean && make -C lib

정적 라이브러리, c파일 - 컴파일

  1. 정적 라이브러리 컴파일
    user@linux:~/Desktop/elp/lab03_mylib$ make -C lib clean && make -C lib libmyfunc.a
  2. hello.c 컴파일
    user@linux:~/Desktop/elp/lab03_mylib$ make clean && make

심볼릭 링크 만들기

원본을 놔두고 여러가지 버전을 만들어서 쓸거임, 동적바인딩 될 hello를 위해 심볼릭 링크를 만든다.
1.
libmyfunc.so : (OBJS) $(CC) -shared -Wl,-soname,@.1 -o $@.1.0 $(OBJS)
ln -s $(TARGET).1.0 $(TARGET).1
ln -s $(TARGET).1 $(TARGET)
sudo cp $@ $@.1 $@.1.0 /usr/lib

  1. libmyfunc.so : (OBJS) $(CC) -shared -Wl,-soname,@.1 -o $@.1.2 $(OBJS)
    ln -s $(TARGET).1.2 $(TARGET).1
    ln -s $(TARGET).1 $(TARGET)
    sudo cp $@ $@.1 $@.1.2 /usr/lib
  2. user@linux:~$ sudo rm /usr/lib/libmyfunc.so.1; sudo ln -s /usr/lib/libmyfunc.so.1.0 /usr/lib/libmyfunc.so.1
  3. user@linux:~/Desktop/elp/lab03_mylib$ ./hello

gcc 컴파일 실습

  1. 링크 안하고 컴파일만, hello.o 생성
    user@linux:~/Desktop/elp/lab03_mylib$ gcc -c hello.c
  2. 링크 안하고 컴파일만, myfunc.o 생성
    user@linux:~/Desktop/elp/lab03_mylib/lib$ gcc -c myfunc.c
  3. 링크까지 해서 hello 실행파일 생성
    user@linux:~/Desktop/elp/lab03_mylib$ gcc -o hello hello.o lib/myfunc.o

make 명령어 프로세스 (type4 사용)

공통적인 과정
1. make 실행 시 makefile에 맨 위 디폴트 타겟을 찾음
2. makeprog 발견
3. main.o로 감
4. main.c 수정 시간, 존재 유무 비교 후 컴파일 실행
5. 나머지 다 마찬가지
6. 컴파일 다 실행하고 링크 연결해서 makeprog 라는 실행파일 생성

type1:

makeprog:	main.o func1.o func2.o
	gcc -o makeprog main.o func1.o func2.o

main.o: main.c
	gcc -c main.c

func1.o: func1.c
	gcc -c func1.c

func2.o: func2.c
	gcc -c func2.c
  • rm *.o makeprog && make : 파일 삭제, 생성

type2:

OBJECTS= main.o func1.o func2.o
TARGET= makeprog

makeprog:	$(OBJECTS)
	gcc -o $(TARGET) $(OBJECTS)

main.o: main.c
	gcc -c main.c

func1.o: func1.c
	gcc -c func1.c

func2.o: func2.c
	gcc -c func2.c

clean:
	rm -f $(TARGET) $(OBJECTS)
  • make clean && make : 파일 삭제, 생성

type3:

OBJECTS= main.o func1.o func2.o
TARGET= makeprog
CC= gcc
CFLAGS= -c
makeprog:	$(OBJECTS)
	$(CC) -o $(TARGET) $(OBJECTS)

main.o: main.c
	$(CC) $(CFLAGS) main.c

func1.o: func1.c
	$(CC) $(CFLAGS) func1.c

func2.o: func2.c
	$(CC) $(CFLAGS) func2.c

clean:
	rm -f $(TARGET) $(OBJECTS)
  • 크로스컴파일러(CC) ARM 용으로 바꾸는법 : user@linux:~/Desktop/elp/lab04_make/type3$ make CC=arm-eabi-gcc

type4:

.SUFFIXES = .c .o
OBJECTS= main.o func1.o func2.o
SRCS= $(OBJECTS:.o=.c)
TARGET= makeprog
CC= gcc
CFLAGS= -g -c

$(TARGET):	$(OBJECTS)
	$(CC) -o $(TARGET) $(OBJECTS)

.c.o :
	$(CC) $(CFLAGS) $<

clean:
	rm -f $(TARGET) $(OBJECTS) core

main.o: io.h main.c
func1.o: io.h func1.c
func2.o: io.h func2.c
  • $ 매크로 변수 사용, TARGET -> @ 치환 가능
  • SRCS= main.c func1.c func2.c == SRCS= $(OBJECTS:.o=.c) (치환)
  • .c.o : 파일 나열 필요없이 OBJECTS 파일에 대해 gcc -c 실행
  • main.o: io.h main.c
    func1.o: io.h func1.c
    func2.o: io.h func2.c ???
profile
Backend Web Developer

0개의 댓글

관련 채용 정보

Powered by GraphCDN, the GraphQL CDN