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 사용법은 다양해서 사용자의 선호하는 방법에 따라
다르게 보일수 있으니 이게 정답이다라고 생각하시면 안됩니다.^^
감사합니다.
'IT > PROGRAM' 카테고리의 다른 글
VirtualBox 윈도우 10 설치 . Win10 ISO 파일 (0) | 2022.09.29 |
---|---|
Pro*C . 한줄 단건만 조회하는 select 예제 (0) | 2022.09.29 |
Pro*C 에러 처리 . SQLCA (0) | 2022.09.27 |
Pro*C 에러 처리 . WHENEVER (1) | 2022.09.26 |
오라클 Pro*C 데이타베이스 DB 접속과 해제하기 (0) | 2022.09.26 |
댓글