본문 바로가기
Linux & UNIX

비주얼 스튜디오와 gcc사용시 라이브러리 만들때의 차이점

by fabxoe 2020. 7. 13.

https://m.blog.naver.com/PostView.nhn?blogId=xogml_blog&logNo=130138049704&proxyReferer=https:%2F%2Fwww.google.com%2F

 

linux library 제작(static, shared, dynamic)

라이브러리와 링킹? printf 함수... 우리는 이것을 어디서 만들지 않았지만 #include 를 ...

blog.naver.com

 

이미 우리는 이러한 스타일로 코딩을 많이 하고 있다. 그 예를 한번 보자.

 

 

//라이브러리 헤더파일에 전역변수 선언 및 초기화

 

이것을 컴파일 하기 위해서

 

gcc main.c my_lib.c -o main

요렇게 컴파일 해주면된다.

 

혹 비주얼 스튜디오에 익숙하면 그냥 프로젝트에 헤더랑 소스 추가해서 작성한담에, 내가 그 헤더 쓰고싶을때 내 코드에

#include "내가만든헤더" 만 해주면 컴파일 잘되길래, 혼동할수도 있는데, 헤더 파일, 즉 *.h 파일은 어느 방법을 써도 그 자체로는

*.c를 가리킬수 없다. 즉 

 

1. 헤더파일에 선언 뿐만 아니라 구현까지 다 해놓던가

2. 각 소스 코드들을 기계어 코드로 바꾼뒤 링킹하던가

3. 아니면 라이브러리를 쓰던가 해야한다

어? my_lib.h에는 1.구현도 않돼있고, 또한 위에 컴파일한 gcc명령에서는 어디에도   3.라이브러리를 사용하는 구석이 보이질 않는데? 

하지만 위의 gcc 명령은 라이브러리(정적)과 완전히 동일한 일을 실행하고, 다른 라이브러리(공유, 동적)와도 링크 과정만 보면 완전 동일.

즉 위의 방법이 "2. 각 소스 코드들을 기계어 코드로 바꾼뒤 링킹하던가" 를 사용한 방식이다.

 

자세한 내용은 링크로!!

 

 

난 귀찮기도 하고 관리하기도 귀찮아서 한 파일안에 이어 붙여서 빌드했다.

 리눅스
 gcc -c -fPIC ./license.c -o license.o    -I/usr/lib/jvm/java-8-openjdk-amd64/include -I/usr/lib/jvm/java-8-openjdk-amd64/include/linux
 gcc -shared -o ./license.so license.o    -Wl,-rpath,/usr/local/lib -L/usr/local/lib
 
 맥
 gcc -c -fPIC ./license.c -o license.o    -I/Library/Java/JavaVirtualMachines/jdk1.8.0_231.jdk/Contents/Home/include -I/Library/Java/JavaVirtualMachines/jdk1.8.0_231.jdk/Contents/Home/include/darwin
 gcc -shared -o ./license.so license.o

댓글