2015년 7월 30일 목요일

Centos c/c++ OCILIB 개발환경 구축(설치) & 설정

Centos c/c++ OCILIB 개발환경 구축

# OCILIB 설치


진행하는 프로젝트에서 뜻하지 않게 유닉스환경에서 오라클과 연동이 필요한 기능이 생겨버리고 말았다.
기존에 윈도우환겨에서만 코딩을 하던 나에겐 리눅스/유닉스 환경이라는 생소한 개발환경이 주는 의미를 미처 다 파악하기도 전에 오랜만에 삽질은 시작되고 말았다.
윈도우의 다음다음 하는 설치의 단순함과 간편함에 젖어 살던 나에게 리눅스라 놈은 나의 1주일이란 시간을 개발환경 구축에만 쏟아 붇게 만들었다.

구축 환경 ( virtualbox, Centos6.4 xwindow  )

일단 gcc등의 컴파일러 관련 설정은 다 되어 있다고 가정하고 글을 진행한다.

(원본보기)
(두번째 보기)



# 오라클과 연동하기 위해서는 오라클 인스턴트 클라이언트 환경이 필요하다.

1. 오라클 인스턴트 클라이인트를 다운

http://www.oracle.com/technetwork/database/features/instant-client/index-097480.html



자신의 os에 해당하는 클라이언트를 선택한다. 위의 경우는 리눅스 32bit~
연동하고자 하는 오라클의 버전을 확인한 뒤 해당 버전과 동일한 버전의 인스턴트 클라이언트 파일들을 다운받자. 필자의 경우는 오라클 11.2.0.1.0 버전이다.



파일 들은 오라클 사이트에 가입해야만 파일을 다운 받을 수 있다.




위와 같이 basic, sqlplus, devel rpm 파일들을 선택하여 다운받는다.
rpm이 아닌 zip파일을 다운받아 사용해도 괜찮지만 이글은 리눅스에 대해 아무것도 모르는 사람을 대상으로 쓰는 것이기 때문에 그냥 위처럼 rpm을 다운받는것으로 진행된다. rpm파일은 window의 setup파일정도 라고 생각하면 된다.

자 이제 basic rpm 파일을 첫번째로 파일 들을 설치하고 나머지 sqlplus 및 devel rpm 파일들을 설치하도록 하자~
폴더를 생성하는 작업이 포함되기 때문에 root 암호를 입력하라는 팝업에 암호를 입력하면 (/usr/include/oracle/11.2/client, /usr/lib/oracle/11.2/client/bin,/usr/lib/oracle/11.2/client/lib)의 폴더가 생성되고 데이터들이 설치된 것을 확인할 수 있다.

다음은 오라클과 c/c++ 어플리케이션에서 연동을 쉽게 도와주는 라이브러리 OCILIB를 다운 받아야 한다.
오라클에서 c/c++연동을 위해 oci 라는 라이브러리를 제공하는데 정말 쓰기 불편하다 그래서 이 OCI 라이브러리를 wrap해서 사용하기 쉽게한 OCILIB 를 사용하여 오라클 연동을 진행할 것이다.

2. OCILIB 다운받기

http://sourceforge.net/projects/orclib/files/OCILIB%20Sources/3.12.1/
버전별: http://vrogier.github.io/ocilib/blog/



ocilib-3.12.1-gun.tar.gz 파일을 다운받고 압축을 풀어준다.

이 포스팅의 최종 목표는 ocilib를 이용한 개발한경구축이다. 일단 개발환경에 필요한 모든 파일들을 다운로드 받았다.
그리고 이젠 OCILIB 라이브러리를 사용하여 개발만 하면 될 것 같다. 그러나 몇가지 더 해야할 일들이 남아 있다. 그 중 첫번째 일이 OCILIB의 설치이다.

3. OCILIB 라이브러리 설치

일단 OCILIB 가이드 pdf 파일을 다운 받아서 살펴 보자
http://sourceforge.net/projects/orclib/files/OCILIB%20Sources/3.12.1/
버전별: http://vrogier.github.io/ocilib/blog/



가이드에서는 아주 간단하게 나와 있다. 일단 다운받은 OCILIB 파일의 압축을 해제한 폴더에서
./configure (Enter)
./make (Enter)
./make install (Enter) <- root 권한으로 실행해야 한다.
이러면 끝난다고 한다.
...
그런데 그냥 이대로 실행하면 두번재 make에서 막힐 것이다.
이유는 가이드에 나와 있다. 다만 영어라서 눈에 잘 안들어 올 뿐이다.

우리가 설치한 클라이언트는 오라클 인스턴트 클라이언트이기 때문에 오라클 해더 파일 경로와 오라클 라이브러리 파일 경로를 "./configure" 입력할때 옵션으로 지정해줘야 한다.



우리가 오라클 인스턴트 클라이언트 rpm 파일들을 설치하면서 생성된 폴더는 이미 위에 언급하였다.

오라클 헤더파일 경로 : /usr/include/oracle/11.2/client
오라클 라이브러리 경로 : /usr/lib/oracle/11.2/client/lib

이경로를 ./configure 실행시 옵션으로 지정해준다.

./configure --with-oracle-headers-path=/usr/include/oracle/11.2/client/ --with-oracle-lib-path=/usr/lib/oracle/11.2/client/lib/



다음 위와 같이 configure 를 실행하고 터미널에 make 명령을 실행한다.

make

다음은 위에서 언급했듯이 make install 명령을 실행해야하는데 root 권한이 필요하다.
터미널창에 su - root 를 실행하여 root 권한을 획득한다.

su - root



이제 ocilib 폴더로 이동한 다음 make install을 실행한다.

cd /home/crexy/ocilib-3.12.1
make install



이제 OCILIB 라이브러리 설치를 모두 마쳤다. 만약 이와 같이 실행이 되지 않는다면 (make 명령 등등) 경로명이나 철자가 틀렸을 가능성이 크다. 리눅스 설치의 오류 메시지가 팝업으로 처리된다면 사용자가 자신의 잘못을 바로 알 수 있겠지만 여기는 리눅스라 출력되는 메시지를 주의 깊게 살펴봐야한다. 터미널은 분명히 오류메시지를 출력한다.

다음 포스팅에서는 오라클 서버 접속 및 OCILIB 라이브러리 사용을 위한 환경변수 작업 및 tnsnames.ora 파일 설정 그리고 이클립스의 OCILIB 개발환경 설정 내용등을 소개 하겠다.




# OCILIB 구성

#물론 아시겠지만 내용중에 등장하는 "crexy"는 사용자 계정이다. 경로에 나오는 "crexy"도 물론 계정명이다 직접 설정 할 경우 자신의 계정명으로 변경해서 하시리라 믿는다.

지난번 포스팅 까지 모든 설정이 거의 마무리 된 것 같으니 개발 툴로 OCILIB 라이브러리의 간단한 코드라도 코딩하고 실제 OCILIB 라이브러리가 제대로 작동하는지 확인하고 싶어진다. 그러나 그전에 현재 오라클 서버와 통신이 제대로 설정되었는지 확인하는 것이 우선이다. 오라클 서버가 있어야 OCILIB 라이브러리도 사용할 수 있다.


4. SqlPlus 동작 확인

sqlplus는 오라클 서버에 터미널 형태로 접속하여 쿼리등을 입력하여 결과를 확인해 볼 수 있는 일종의 쿼리툴이라 할 수 있다. 일단 이 sqlplus를 통해 오라클 인스턴트 클라이언트의 정상작동 여부를 확인할 수 있다.

일단 터미널 하나 열과 sqlplus 를 입력하고 엔터를 눌러보자



먼가 안된다는 소리인 것같다. 쉐어드 라이브러리를 열지 못한다는 뭐 그런소리인 것같다.
이런 상태를 옳바르게 변경해주기 위해서 우리는 시스템 변수를 설정해줘야 하는데 윈도우에서는 환경변수 설정이라는 곳에서 설정해 주었지만 리눅스에서는 bash_profile 이라는 파일을 수정해줘야 한다.
일단 터미널에 vim ~/.bash_profile 이라고 입력하고 엔터를 눌러주자.

vim ~/.bash_profile

문서 맨아래에 다음과 같이 내용을 입력하고 문서를 저장한다. (vim 사용설명은 따로 하지 않겠음~)

LD_LIBRARY_PATH /usr/lib/oracle/11.2/client/lib;export LD_LIBRARY_PATH

시스템에 라이브러리 경로를 설정해주는 작업이다.



수정된 문서를 시스템에 적용시켜주기 위해 source ~/.bash_profile 이라 입력하고 엔터를 눌러주자. 

source ~/.bash_profile

그리고 다시 터미널에 sqlplus 아이디/패스워드/연결식별자 를 치고 엔터를 눌러주자.  연결식별자(서비스 아이디/SID)는 오라클 서버 관리자에게 물어보면 갈켜줄 거다.
필자의 경우 기본 서비스명 인 "orcl" 이다.



먼가 되는 것 같은데 오류 메시지가 보인다 연결식별자를 해결할 수 없다고 한다 분명 연결 식발자를 입력했는데 아니란다. 아무래도 먼가를 더해줘야 할 것 같은 느낌이든다. 이 에러의 원인은 tnsnames.ora 파일을 설정해주지 않았기 때문에 발생하는 것이다. 오라클 클라이언트는 tnsnames.ora 에 명세된 내용을 보고 오라클 서버를 찾아 접속한다. 내용을 보면 간단한 서버 아이피/포트 및 서버 서비스 이름정도의 내용이 담겨 있는 파일이다. 이 파일은 현재 존재하지 않기 때문에 직접 작성하거나 오라클 관리자에게 달라해야 한다. 그런데 별 어려운 내용이 없기 때문에 직접 작성해보도록 한다. 
oracle 이라는 폴더를 계정 홈폴더에 새로 만들고 그폴더로 이동한다.

mkdir oracle
cd oracle
vim tnsnames.ora

그리고 문서에 다음과 같이 입력하고 저장한다.
"SID"=
    (DESCRIPTION = 
        (ADDRESS = (PROTOCOL = TCP)(HOST = "오라클 서버 아이피")(PORT=1521))
        (CONNECT_DATA = 
            (SERVER = DEDICATED)
            (SERVICE_NAME = "서비스 네임")
        )
    )



그리고 나서 시스템에 이 tnsnames.ora 파일이 어디에 있는지 가르켜 줘야 한다. 다시 bash_profile 파일을 수정해야한다.

vim ~/.bash_profile

그리고 맨 아래에 다음을 입력하고 저장한다.

TNS_ADMIN=/home/crexy/oracle;export TNS_ADMIN



수정된 bash_profile을 시스템에 새로 적용시키고

source ~/.bash_profile

다시한번 sqlplus 를 통해 오라클에 접근해보자

sqlplus crexy/1111@orcl




이제서야 접속이 성공적으로 이루어 졌고 오라클 인스턴트 클라이언트의 설정에 대한 작업이 마무리 된 것이다.
이제 이클립스 CDT에서 OCILIB 빌드 옵션을 지정해주는 일만 남았다.


5. 이클립스 CDT에서 OCILIB 빌드 옵션 설정

이클립스 CDT는 이클립스에서 c/c++ 개발을 할 수 있게 플러그인을 설치해준 경우라 할 수 있다. 우선 이 CDT에 대한 설정은 되어 있는 것으로 여기고 진행하겠다.

우선 프로젝트를 하나 생성하고



메뉴의 프로젝트(Project)->특성(Properties)->C/C++Builder->설정(Setting) 으로 이동해서

GCC C++ Compiler 와 GCC C Compiler includes 부분에 OCILIB 헤더 폴더 경로(/usr/local/include)를 입력한다. 이전 포스트에서 OCILIB 라이브러리를 설치해서 파일들이 설치된 경로가 설정된 경로이다.



그리고 OCILIB 옵션을 설정해줘야 하는데  OCI_IMPORT_LINKAGE, OCI_CHARSET_ANSI 이다. 오라클 라이브러리를 컴파일시에 한다는 것과 모든 문자열을 Ansi 문자열을 사용한다는 설정이다. 설정에 대한 더 자세한 내용은 가이드 북을 참고하기 바란다.

Charset

  • OCI_CHARSET_ANSI
  • OCI_CHARSET_UNICODE
  • OCI_CHARSET_MIXED

그리고, Import

  • CI_IMPORT_LINKAGE
  • OCI_IMPORT_RUNTIME




마지막으로 라이브러리 설정이다. 오라클 공유 라이브러리와 OCILIB의 경로와 OCILIB의 를 지정해주면 된다.



이제 OCILIB 를 사용하는 연결 기본 코드를 코딩하여 설정을 테스트 해보자

#include "ocilib.h"

int main() {

  OCI_Connection *cn;

  if(!OCI_Initialize(NULL, NULL, OCI_ENV_DEFAULT|OCI_ENV_CONTEXT))
    return -1;

  cn = OCI_ConnectionCreate("orcl", "crexy", "1111", OCI_SESSION_DEFAULT);

  if( cn == NULL ) {
    OCI_Error *err = OCI_GetLastError();
    printf("Errcode : %d, ErrMsg : %s\n", OCI_ErrorGetOCICode(err), OCI_ErrorGetString(err));
  }
  else {
    printf("Oracle connection success!\n");
  }

  OCI_Cleanup();

  return 0;
}


간단하게 오라클에 접속하는 코드이다. 컴파일 해보자 




안된다. libocilib.so.3 파일을 찾을 수 없다고 한다. 참 끝까지 사람 귀찮게 한다. 이 에러는 시스템 변수 LD_LIBRARY_PATH에 libocilib.so.3 파일이 속한 경로를 지정되지 않아서 생기는 오류이다. 다시 bash_profile 을 수정해야 한다. 경로는 /usr/local/lib 이다. 이클립스에서 라이브러리 경로로 지정된 경로이다. 참 경로까지 지정했으면 좀 찾아서 할 것이지 왤케 사람 힘들게 하는지 모르겠다 싶지만 컴파일러에서 원하는 경로와 OCILIB에서 원하는 경로가 따로이기 때문에 어쩔 수 없다. 터미널로 나가서 bash_profile을 수정해주자.

vim ~/.bash_profile

LD_LIBRARY_PATH 항목을 다음과 같이 수정해주자

LD_LIBRARY_PATH=/usr/lib/oracle/11.2/client/lib:/usr/local/lib;export LD_LIBRARY_PATH




저장하고 bash_profile을 갱신해주자

source ~/.bash_profile

다시 이클립스로 돌아가서 컴파일 시켜보자
(그래도 안될 경우 리부팅 하자 source는 해당 프로세스에만 적용되는 명령인 것 같다. 다른 이클립스와 다른 터미널에서 문서를 수정했다면 안될 것이다.)




잘된다. 이제 모든 설정이 마무리 되었다. 더 자세한 내용과 이후 OCILIB 코딩에 관해서는 가이드 북을 참고하길 바란다.
생각해 보면 이렇게 장황하게 포스팅을 할 필요 없이 간단하게 요점만 찝어서 텍스트로 포스팅해도 될 것 같았는데, 이모든 포스팅은 이 작업을 하면서 리눅스에 경험이 없던 본인이 겪었던 삽질들을 거즘 다 언급한 거라 여기면 될 것이다.
이작업으로 아주 살짝 리눅스의 개념을 알 수 있어서 힘들지만 값진 시간이 된 것 같았다.






댓글 없음:

댓글 쓰기