MinGW과 Pro*C

2023. 3. 19. 19:30프로그래밍

728x90

목차

1. 오라클 클라이언트 다운로드​

​2. sample.pc의 proc 컴파일 명령

​3. Trouble-shooting

​4. MinGW용 라이브러리 생성 - pexports ​

​5. Precompile 된 파일 gcc로 컴파일 하기

​6. Appendx A- sample.pc

​7. Appendx B- Makefile 일부​

앞선 문서1에서는 자세히 Pro*C를 컴파일 한 것이 아니고, 그냥 pexports 유틸을 사용하여 윈도우에서 Pro*C를 개발 할 수 있다라는 것이고, Hello world만 찍고 말았기 때문에 그냥 저자 말대로 다 되는 가 확인 차원에서 구성하여 보았다.

따라서, MinGW환경에서 gcc를 사용해서 Pro*C를 사용하기 위한 방법을 알아보기로 한다.

(누가 그러던가? GCC는 소프트웨어 개발자에게 내리신 하늘의 선물이라고....)

1. 오라클 클라이언트 다운로드

우선 저번 문서2를 참고 해서 오라클 클라이언트다운 받는다

저번 문서에서는 설치를 위해서 기본 라이브러리와 sqlplus 패키지만 받았는 데

이번에는 Instant Client Package - Precompiler3 를 받아야 할 것이다.

약 980k 정도 되는 파일이며, 이 파일을 저번 문서에서 저장한 디렉토리로 복사한다.

2. sample.pc의 proc 컴파일 명령 - precompile

​sample.c 파일을 생성하기 위한 precompile을 해보도록 한다.

기본 컴파일 골격 구조는 다음과 같다.

​proc parse=partial code=cpp 'sys_include=(/opt/gcc/include, /usr/include, $ORACLE_HOME/sdk/include)' iname=sample
 

cpp 용으로 컴파일 하기 위해서 ​

proc iname=sample include=/opt/gcc/include include=/usr/include include=$ORACLE_HOME/sdk/include PARSE=PARTIAL RELEASE_CURSOR=YES MODE=ANSI CODE=CPP
 

c 용으로 컴파일 하는 것은

proc iname=sample include=/opt/gcc/include include=/usr/include include=$ORACLE_HOME/sdk/include PARSE=PARTIAL RELEASE_CURSOR=YES MODE=ANSI
 

3. Trouble-shooting

다음과 같은 에러가 날 수 있다.

#include <stddef.h>
.........1
PCC-S-02015, unable to open include file
#include <stdarg.h>
.........1
PCC-S-02015, unable to open include file​
 

위는 표준 gcc 라이브러리를 못찾은 것인데, 원하는 형식대로 해당 디렉토리를 링크하면된다.

예를 들어 현재 환경에서 이 파일의 위치는 ~\MinGW\lib\gcc\mingw32\4.8.1\include이다.

fstab 파일안에 이 위치를 넣어줘도 좋을 듯하며, 나의 경우에는 /opt/gcc로 했다

기억이 안난다면 예전문서4를 참고하자.

 

최종적으로 다음과 같이 컴파일 하였다.

proc iname=sample include=/usr/include include=/software/oracle/instantclient_12_1/precomp include=/software/oracle/instantclient_12_1/sdk/include include=/home/03987/src/cross-platform/incl PARSE=PARTIAL RELEASE_CURSOR=YES MODE=ANSI​
 

 

​4. MinGW용 라이브러리 생성 - pexports

저번 문서5에서 알아 본 pexports 를 사용해서 dll에서 MinGW 컴파일을 위한 라이브러리 파일을 만들어 보도록 하자

$ORACLE_HOME으로 가서 orasql12.dll과 oci.dll을 라이브러리화 한다.

 

pexports -o orasql12.dll > orasql12.def
dlltool --def orasql12.def --dllname orasql12.dll --output-lib liborasql12.a
pexports -o oci.dll > oci.def
dlltool --def oci.def --dllname oci.dll --output-lib liboci12.a
 

혹은, version 11_2 에 대해서 다음과 같이 이름을 정의하였다.

pexports -o orasql11.dll > orasql11.def
dlltool --def orasql11.def --dllname orasql11.dll --output-lib liborasql11.a
pexports -o oci.dll > oci11.def
dlltool --def oci11.def --dllname oci.dll --output-lib liboci11.a
 

설명은 따로 필요 없을 듯 하다...

 

5. Precompile 된 파일 gcc로 컴파일 하기

저번 문서의 Makefile6을 참고하여 작성한다. 그리고 Makefile의 일부는 Appendix에서 참고하도록 한다. 그리고 다음 사이트7도 참고하자

 

Appendix A - sample.pc

#include <stdio.h>
#include <string.h>
#include <sqlda.h>
#include <sqlcpr.h>
#define USERID "aa"
#define PASSWD "aaaa"
#define USING "DSN=xxx.xxx.xxx.xxx;CONNTYPE=1;PORT_NO=xxxx"

EXEC SQL BEGIN DECLARE SECTION;
	VARCHAR uid[30];
	VARCHAR pwd[30];
	VARCHAR conn_opt[100];
EXEC SQL END DECLARE SECTION;

EXEC SQL INCLUDE SQLCA.H;

void main()
{

	strcpy(uid.arr,USERID);
	uid.len =strlen(uid.arr);
	strcpy(pwd.arr,PASSWD);
	pwd.len = strlen(pwd.arr);
	strcpy(conn_opt.arr, USING);
	conn_opt.len = strlen(USING);

	EXEC SQL WHENEVER SQLERROR GOTO errexit;
	EXEC SQL CONNECT :uid IDENTIFIED BY :pwd USING:conn_opt;
	printf("Connected to Oracle11g using R3PRBRPT/R3PRBRPTADM\n");
	EXEC SQL COMMIT WORK RELEASE;

	return;

	errexit:
	printf("Connection failed");
	return;
} /* end of main */
 

Appendix B - Makefile 일부

TARGET = default
MY_HOME = /home/03987/src/cross-platform
CC = gcc
EXE = test_conn
PROC = proc
RM = rm -rf
COPY = cp
ECHO = echo
LIB = -L$(ORACLE_HOME) -lorasql12 -L/usr/lib -lpthreadGC2d -L/opt/gcc/lib -lm
PROCINC = include=/usr/include \
include=/opt/gcc/include \
include=$(ORACLE_HOME)/precomp \
include=$(ORACLE_HOME)/sdk/include \
include=$(MY_HOME)/incl
CINC = -I. -I$(ORACLE_HOME)/sdk/include
OBJ_OPT = -D_CRON -D_DEBUG
#ORA_OPT = PARSE=PARTIAL RELEASE_CURSOR=YES MODE=ANSI CODE=CPP
ORA_OPT = PARSE=PARTIAL RELEASE_CURSOR=YES MODE=ANSI
CC_OPT = -D_CRON -D_DEBUG
CC_OPT2 = -D_REENTRANT -c -g -r -w -O
OBJECTS = $(TARGET).o
ORA_GARBAGE = *.dcl *.cod *.cud *.lis
######## implicit rules
.... 생략
 

 

이상.


 

728x90