본문 바로가기

별걸다하는 IT/데이터베이스 Database

[proc/c++] gcc/cc로 pc파일 컴파일 하기 (makefile 없이 샘플 소스 기초 컴파일방법)

반응형

[DBMS/ SQL/ PROC 포스팅 정리 링크]

안녕하세요~~

두 번째로 가져온 proc 포스팅입니다.

오늘은 proc를 컴파일 하는 방법에 대해 알아볼건데요.

 

이번 포스팅은 cc, gcc로 컴파일 하는 법을 알아보고, 

다음 포스팅에서 이걸 기반으로 pc 파일 컴파일하는 makefile 작성하는 법을 소개해볼까 합니다.

 

아마 거진 대부분 회사에서는 c언어 소스던 pc소스던 makefile로 컴파일을 하고 있겠지만,,

컴파일하는 툴을 떠나서, 컴파일 과정과 방법이 중요한거니까요~~!

 

pro*c 컴파일 하는 방법 

SQL문을 포함한 소스파일은 확장자 .pc를 갖는데요~~~

이 pc파일의 경우 컴파일을 두 번 해줘야해요!!

 

출처: 오라클공식

pro*c라는거 자체가 사실 프리컴파일러예요.

 

pc파일에 포함된 SQL문을 함수호출문으로 전환해서 결국 C언어 프로그램으로 바꾼 뒤에, (.pc->.c)

c파일을 다시 컴파일해서 실행파일을 만들어줘야 합니다. (.c -> .o -> .exe)

 

컴파일 명령어 옵션도 많은데,,

두번이나 컴파일 명령어를 실행시켜야 하는 작업이 번거롭기 때문에

저처럼 잠깐 테스트하는 경우 아니면 사실상 make를 써서 컴파일하는게 효율적이죠.ㅎㅎ

 

1. test.pc 만들기

간단하게 테스트용으로 사용할 test.pc를 만들어봅시다.

test.pc에는 오라클 DB를 연결하는 내용만 있어요. 

test.pc에 작성된 문법이나 설명에 관련된건 아래 포스팅에 설명해두었으니 소스이해가 어려운 분은 참고하면 좋을 듯 합니다.

2022.02.04 - [별걸다하는 IT/데이터베이스 Database] - [Pro*C/C++] C/C++언어에서 오라클 DBMS 연동하기 (proc 접속/연결하기)

 

▼ test.pc 소스

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
    EXEC SQL INCLUDE sqlca.h;
    EXEC SQL BEGIN DECLARE SECTION;
    varchar id[50];
    varchar password[50];
    EXEC SQL END DECLARE SECTION;

    memset(&id, 0x00, sizeof(id));
    memset(&password, 0x00, sizeof(password));

    strcpy((char*)id.arr, "hr");
    strcpy((char*)password.arr, "hr");

    id.len = strlen((char*)id.arr);
    password.len = strlen((char*)password.arr);

    EXEC SQL CONNECT :id IDENTIFIED BY :password ;
    if(sqlca.sqlcode < 0) {
        printf("connect error\n");
    }
    else {
        printf("connect success\n");
    }
    return 0;
}

필요하신 분이 있을 것 같아 파일첨부도 같이 해놓을게요

test.pc
0.00MB

2. test.pc -> test.c

[기본 pro*c 컴파일 문법]

proc test.pc

.pc파일을 .c프로그램으로 변환하는 명령어는 아주 간단해요!!

proc 명령어로 컴파일 해주면 됨.

 

이 결과로 test.c 파일이 생성되게 됩니다.

간단한 SQL문들을 C컴파일러가 해석할 수 있도록 Libarary 함수 호출 형태로 변경되었기 때문에 당연히 파일 크기가 더 커요.

 

[인풋파일명, 아웃풋파일명 지정하고 싶을 때]

proc iname=test.pc oname=test.c.20220211

iname이랑 oname이라는 옵션이 추가되었는데요.

i는 in을, o는 out을 의미한다 생각하면 돼요.

 

iname은 컴파일하려는 대상 pc파일을 뜻합니다. (인풋파일)

결론적으로 'proc iname=test.pc' 명령어나, 'proc test.pc'나 똑같아요

oname은 결과파일인데요. pc파일을 컴파일하면 c파일이 생긴다고 했죠? c파일의 이름형식을 지정해주는 거예요

cmd창에서 해당 명령어를 쳐봤더니

test.c가 아닌, test.c.20220211로 결과파일이 떨궈진 것을 확인할 수 있어요.

 

[C++언어 , cpp 파일 경우]

c++ 언어일 경우 옵션으로 세팅해줘야 할게 약간 있어요.

proc iname=sample.pc code=cpp cpp_suffix=cpp

code라는 옵션은 proc 컴파일러로 생성되는 함수 프로토타입 포맷을 지정하는건데요

디폴트가 C언어입니다. C++일 경우 code=cpp로 세팅해주면 돼요.

 

또 c++확장자가 어떤 걸 갖는지 지정해주는 옵션으로 cpp_suffix가 있어요.

확장자가 cpp라면, CPP_SUFFIX=cpp

확장자가 cc라면 CPP_SUFFIX=cc

요렇게 경우에 따라 세팅하면 됩니다.

 

이 외에 더 많은 옵션들이 있지만, 이건 기초 포스팅이기 때문에! 

궁금하신 분들은 'pro*c compile options' 검색하면 많은 자료들을 찾을 수 있을거예요 ㅎㅎ

 

[실습 테스트]

유닉스 AIX에서 실습테스트

proc로 컴파일 해준 이후, test.c 파일이 새로 생성된 것을 확인할 수 있습니다.

 

3. test.c -> test

2번에서 나온 test.c 파일 가지고 실행파일을 만들어볼거예요

cc -I${ORACLE_HOME}/precomp/public -L${ORACLE_HOME}/lib -lclntsh test.c -o test

리눅스 유닉스 운영체제에서 명령어는 위와 같습니다.

 

gcc -I%ORACLE_HOME%precomp\public %ORACLE_HOME%\bin\orasql18.dll test.c -o test.exe

윈도우 운영체제에서는 이렇게 작성해주시면 돼요.

 

{ORACLE_HOME}/precomp/public에는 sql처리 관련된 헤더파일들이 저장되어있는데요.

제 코드를 보면 sqlca.h가 include되어 있는데, 이 헤더파일을 컴파일이 찾아 링크할 수 있도록 

'-I{ORACLE_HOME}/precomp/public'옵션을 넣은겁니다.

 

-I : 링크할 라이브러리를 지정

 

[실습 테스트]

유닉스 테스트

짠 test파일이 잘 생성되었네요.

 

윈도우에서 테스트

윈도우에서 동일하게 pc파일을 만들어서 컴파일을 진행해봤어요.

마찬가지로 test.exe가 잘 생성된 것을 확인할 수 있습니다.

test.exe를 실행해봤더니 성공적으로 DB접속 또한 연결되어 connect success! 를 출력한 것을 확인할 수 있습니다.

 

오늘은 간단하게 proc와 gcc명령어를 이용해

pro*c, pc파일 컴파일 하는 법에 대해 알아봤어요.

공감은 큰 힘이 됩니다! 다음 포스팅에서 봐요~~

반응형