이미 우리는 이러한 스타일로 코딩을 많이 하고 있다. 그 예를 한번 보자.
//라이브러리 헤더파일에 전역변수 선언 및 초기화
이것을 컴파일 하기 위해서
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
'Linux & UNIX' 카테고리의 다른 글
프롬프트명 일시변경 (0) | 2021.06.02 |
---|---|
firewall-cmd 명령어로 centos7 방화벽 포트 열기 (0) | 2020.09.29 |
LD_PRELOAD 사용법 (0) | 2020.07.12 |
리눅스(우분투)에서 JNI 빌드하기 (0) | 2020.07.08 |
리눅스에서 쉘스크립트나 jar의 백그라운드 실행 'nohup' (0) | 2020.06.19 |
댓글