본문 바로가기
IT/PROGRAM

Pro*C 컴파일 과정과 Makefile 만들기

by SidePower 2022. 9. 28.

 

Pro*C 프로그램 파일 확장자는 pc 입니다.

pc 파일을 컴파일 하는 과정은

오라클에서 제공하는 PreCompiler를 통해 c 파일로 만듭니다.

c 파일을 다시 c 컴파일러인 gcc를 통해 오브젝트 파일 (.o)를 만들고

링크를 통해 실행파일로 되는거에요.

sample.pc → sample.c → sample.o → sample

 

PreCompiler를 사용하기 위해 우선 ORALCE이 설치된 경로를 설정해 줘야 됩니다.

오라클 설치 경로가 /usr/oracleClient/app/oracle 라고 가정할게요.

vi .bash_profile

export ORACLE_BASE=/usr/oracleClient/app/oracle 
export ORACLE_HOME=$ORACLE_BASE/product/12.1.0/ora_home
export ORACLE_SID=oraCli
export TNS_ADMIN=$ORACLE_HOME/network/admin
export NLS_LANG=KOREAN_KOREA.KO16KSC5601
export PATH=$HOME/bin:$ORACLE_HOME/bin:/bin:/usr/bin:/usr/sbin:.:$PATH
export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/usr/lib:/lib:/usr/local/lib:$LD_LIBRARY_PATH
export ORA_CONNECT_NOTE=user1/passwd1@REMOTE_DB1 // 오라클 로그인 정보

 

나의 리눅스 접속 계정의 profile안에 위의 오라클 환경변수를 모두 등록해주세요.

 

그리고 ORA_CONNECT_NOTE는 계정정보인데요.

pc 프로그램 코딩할때 소스안에 계정과 비밀번호를 노출하지 않을려고 

환경변수를 이용할려고 해본거에요. 선택사항입니다.ㅋ

오라클 환경 변수 의미
ORACLE_BASE와 ORACLE_HOME 오라클 설치 경로
ORACLE_SID 오라클 SID
TNS_ADMIN 원격 오라클 접속 정보가 있는 TNSNAMES.ORA 경로
NLS_LANG 오라클 캐릭터셋
PATH $ORACLE_HOME/bin
PreCompiler인 proc 사용을 위한 경로
LD_LIBRARY_PATH $ORACLE_HOME/lib
오라클 라이브러리 경로

 

 PreCompiler

pc파일을 c파일로 만들기 위해

오라클에서 제공하는 프리컴파일러(=proc)를 이용합니다.

proc pc파일 또는 proc iname=pc파일

 

[tmach@localhost test]$ ll
test.pc

// .pc라는 확장자를 입력해도 되고 안해도 됩니다. proc test Or proc iname=test
[tmach@localhost test]$ proc test.pc 또는 proc iname=test.pc
Pro*C/C++: Release 12.1.0 - Production on 금 1월 28 23:22:07 2022
Copyright (c) 1982, 2014, Oracle and/or its affiliates. All rights reserved.
System default option values taken from: /usr/oracleClient/app/oracle/proc/pcscfg.h

[tmach@localhost test]$ ll
test.c
test.lis
test.pc

[tmach@localhost test]$

 

 gcc 컴파일

이제 test.c 파일이 만들어졌으니

gcc를 이용해서 일반 c 파일을 컴파일 하는거 처럼 동일하게 컴파일해서

실행파일을 만들면 됩니다.

 

그리고 test.c은 일반 c 소스파일로 만들어졌지만

test.c 소스에 오라클 연동과 SQL 쿼리 해석에 관련된 오라클 전용 코딩이 첨부되어 있기때문에

gcc 컴파일시 오라클 클라이언트 공유라이브러리(clntsh)를 참조할수 있도록 해야 됩니다.

 

gcc에서 공유라이브러리(shared library)를 참조하는 방법은

① -L 옵션 뒤에 공유라이브러리 디렉터리 위치를 기록합니다.

clntsh의 위치는 오라클이 설치된 경로의 lib 디렉터리안에 있습니다.

그래서 $ORACLE_HOME/lib로 지정할수 있어요.

② -l (소문자 L)옵션 뒤에 공유라이브러리명을 쓰는거에요.

공유라이브러리 파일은 libclntsh.so 입니다.

공유라이브러리명 쓰는 법은 앞에 lib 빼고 뒤에 .so를 뺀 거에요.

그래서 clntsh를 쓰면 됩니다.

[tmach@localhost test]$ ll
test.c
test.lis
test.pc

[tmach@localhost test]$ gcc test.c -o test -L$ORACLE_HOME/lib -lclntsh

[tmach@localhost test]$ ll
test
test.c
test.lis
test.pc

[tmach@localhost test]$ test
test 실행 결과..
................

[tmach@localhost test]$

 

● Pro*C Makefile 만들기

위에서 알수 있듯이 Pro*C 소스파일(.pc)을 컴파일하는 방법은 

아래 2줄이면 간단하게 되는데요.  굳이 Makefile을 만들 필요가 있을까요?

① proc test.pc 또는 proc iname=test.pc

② gcc test.c -o test -L$ORACLE_HOME/lib -lclntsh

 

예...만드셔야 되요. 2줄도 많습니다.^^;;

완벽한 사람은 없어요.

반복되는 소스 수정과 컴파일은 사람을 지치게 만들어요.

Makefile을 이용하면 make 라는 알파벳 4개로 끝입니다.ㅋ

 

Makefile을 이용하면 컴파일이 간단하고

Makefile을 보고 있으면 프로그램 참조 관계를 한눈에 파악할수도 있고

또 프로그램이 복잡해져 여러 라이브러리나 옵션 추가시에

Makefile에 쉽게 추가 할수도 있어요.

 

Makefile 만드는 법은 생각보다 그리 어렵지 않아요.

test.pc라는 소스를 컴파일하는 Makefile입니다.

## Makefile 만들기 ##

PC_LIST = test.pc
C_LIST = ${PC_LIST:.pc=.c}
OBJ_LIST = ${PC_LIST:.pc=.o}

TARGET = test

ORA_LIB_PATH = -L$(ORACLE_HOME)/lib
ORA_LIB = -lclntsh

.SUFFIXES : .pc .c .o

.pc.o:
	proc iname=$<
	gcc -c $(C_LIST)

all: clean $(TARGET)

$(TARGET): $(OBJ_LIST)
	gcc -o $(TARGET) $(ORA_LIB_PATH) $(ORA_LIB) $^
    
clean:
	rm -f $(TARGET) $(TARGET).lis $(C_LIST) $(OBJ_LIST)

컴파일 과정에서 생기는 c o lis 파일들과 실행파일을 정리(삭제)하기 위해

clean 이라는 더미타겟(dummy target)을 만드는데요.

컴파일하기 전에 make clean으로 정리한것을 make 할때 자동으로 clean을 실행하고 싶어서

all: clean $(TARGET) 로 지정해서 clean을 먼저 수행하게끔 했어요.

 

● make 실행하기

[tmach@localhost test]$ ll
Makefile
test.pc

[tmach@localhost test]$ make
rm -f test test.lis test.c test.o
Pro*C/C++: Release 12.1.0 - Production on 금 1월 28 23:22:07 2022
Copyright (c) 1982, 2014, Oracle and/or its affiliates. All rights reserved.
System default option values taken from: /usr/oracleClient/app/oracle/proc/pcscfg.h

gcc -c test.c
gcc -o test -L/usr/oracleClient/.../lib -lclntsh test.o

[tmach@localhost test]$ ll
Makefile
test
test.c
test.lis
test.o
test.pc

[tmach@localhost test]$ make clean
rm -f test test.lis test.c test.o

[tmach@localhost test]$ ll
Makefile
test.pc

 

Makefile 사용법은 다양해서 사용자의 선호하는 방법에 따라

다르게 보일수 있으니 이게 정답이다라고 생각하시면 안됩니다.^^

 

 

감사합니다.

반응형

댓글