화요일, 9월 29, 2009

XWiki logo

C 개발 환경 구축하기

시작하기에 앞서

이 문서는 국민대학교 컴퓨터 학부생들에게 리눅스 기반의 C 개발환경을 설명하고자 작성되었습니다. 특히 리눅스 콘솔에서 일반 IDE 에 버금가는(?) C 개발 환경을 구축하는데 필요한 몇가지 유틸리티에 대해 자세히 설명합니다. vi 는 'VIsual display editor' 의 약자로 리눅스 환경의 프로그래머들이 처음 접하게 되는 텍스트 에디터 가운데 하나 입니다. vim (Vi iMproved) 은 vi 의 대부분 명령들을 지원하고, 프로그래머들을 위한 편리한 기능들이 추가되었습니다. 대부분의 운영체제(Linux, Solaris, Windows, MAC, Amiga, BeOS … )를 지원할 뿐만 아니라 사용자들이 자신의 취향에 맞는 개발 환경을 구축할 수 있도록 다양한 플러그인들을 제공합니다.(http://www.vim.org) 이러한 플러그인 가운데 압도적인 다운로드 수를 자랑하는 플러그인인 taglist, buffer explorer, windowManager 의 설정에 대해 알아봅니다. 또한 많은 소스코드들을 쉽게 브라우징할 수 있는 ctag 라는 리눅스 유틸리티를 소개합니다.

설치 및 설정

현재 linux.cs.kookmin.ac.kr 에는 ctags, taglist, windowManager 의 설치 및 설정이 이미 되어 있어 추가적인 설정이 필요하지 않습니다. 따라서 이부분은 학생들이 필요한 경우(개인이 사용하는 데스크탑, 노트북에서 설정할 경우) 를 위한 설명입니다.

  • ctags 설치
1. Fedora 일 경우
$ yum install | grep ctags

2. Ubuntu 일 경우
$ aptget install | grep ctags

3. window 일 경우
http://sourceforge.net/projects/ctags 에서 다운로드 및 exe 파일 실행
http://www.vim.org/scripts/index.php 에서 taglist 와 windowManager, minibuffer explorer 를 검색하여 다운받는다.
  • taglist 설치 및 설정
* http://www.vim.org/scripts/download_script.php?src_id=7701 에서 다운로드
$ wget http://www.vim.org/scripts/download_script.php?src_id=7701


* 자신의 홈디렉토리에 .vim 디렉토리를 만든다.
$ mkdir ~/.vim


* ~/.vim 디렉토리에 다운받은 taglist 를 압축푼다.
$ unzip taglist_45.zip -d ~/.vim


* 자신의 홈디렉토리에 .vimrc 파일을 생성하고 아래 내용을 추가한다.
$ vi ~/.vimrc

" for taglist
let Tlist_Ctags_Cmd="
/usr/bin/ctags"
let Tlist_Inc_Winwidth=0
let Tlist_Exit_OnlyWindow = 1 "
let Tlist_Show_Menu = 1
set tags+=./tags,../tags,../../tags,../../../tags,tags


" for miniBufExplorer
let g:miniBufExplMapWindowNavVim = 1
let g:miniBufExplMapWindowNavArrows = 1
let g:miniBufExplMapCTabSwitchBufs = 1
let g:miniBufExplMapCTabSwitchWindows = 1
let g:miniBufExplModSelTarget = 1


"
for WindowManager
let g:winManagerWindowLayout = "FileExplorer|TagList"
let g:persistentBehaviour = 1

  • taglist 와 마찬가지로 miniBufferExplorer 와 windowManager 를 ~/.vim/plugin 에 다운 받는다.

vi 에서 taglist 실행하기

  • vi 에서 taglist 를 사용하기 위해서는 소스코드의 최상위 디렉토리에서 ctags 명령이선행되어야 한다.
$ ctags -R ./*
1_ctags.JPG
  • vi 에서 taglist 를 실행하기
$ vi lmc.c 를 실행하고 vi 의 커맨드모드에서 WMToggle 입력
2_vi_taglist.JPG
  • WMToggle 명령의 결과로 다음과 같은 화면으로 바뀐다.
3_wmtoggle.JPG

  • 모든 태그들을 제대로 이용하기 위해서는 반드시 소스코드의 최상위 디렉토리에 ctags 명령으로 생성되는 tags 파일이 생성되어야 하고 항상 lmc.c 에서 코드 브라우징이 시작되어야 한다.

taglist 명령어들

  • 태깅된 단어에 해당하는 함수나 변수, 매크로로 이동하기(점프)
$ ctrl + ]

설명 : lmc.c 의 while(!LittleMan()) 라인의 LittleMan 함수에 커서를 위치시키고

컨트롤 키와 "]" 를 동시에 누르면 LittleMan 이 정의 되어 있는 곳으로 점프한다.
4_wmtoggle_cmd.JPG
  • 원래 위치로 다시 돌아오기
$ ctrl + t
$ 설명 : "ctrl + ]" 로 이동했던 곳에서 원래 위치로 되돌아 온다.

  • taglist 윈도우에서 이동하고자 하는 함수나 변수, 매크로로 이동하기
taglist 윈도우에 보이는 함수나 변수 매크로위에 커서를 두고 엔터를 누른다

  • filelist 윈도우에서 파일 열기
filelist 윈도우에 보이는 파일에 커서를 두고 엔터를 누른다

  • 윈도우간 이동
wmtoggle 을 이용하여 taglist 를 실행시킬 경우 edit 윈도우와 filelist 윈도우, taglist 윈도우가 모두 열리게 된다. 이때 기본적으로 edit 윈도우에 커서가 위치한다. 3 가지 윈도우간에 커서를 이동시키고 싶을때는 다음 명령어를 사용한다.

  •  
    • edit 윈도우에서 taglist 윈도우로 커서를 이동하고 싶은 경우
$ ctrl + w + h

  •  
    • taglist 윈도우에서 edit 윈도우로 커서를 이동하고 싶은 경우
$ ctrl + w + l

  •  
    • taglist 윈도우에서 filelist 윈도우로 커서를 이동하고 싶은 경우
$ ctrl + w + j

사용자 개별 설정

자신의 홈디렉토리에 있는 .vimrc 파일에 다음과 같은 추가적인 설정을 함으로써 조금더 편한 개발 환경을 구축할 수 있습니다.

.vimrc 에 다음과 같은 단축키를 등록하고 유용하게 사용하세요.

map wm :WMToggle
map ti :set noic
map tI :set ic
map t/ :noh
map tn :set nu
map tN :set nonu

실제로 사용해보면 매우 편리한 기능들입니다..
어떤 옵션들인지 한번 찾아봅시다~~

리눅스 및 vi 참고 자료

 site설명 
 http://kldp.org/ 리눅스 설치부터 다양한 설정에 대한 정보를 담고 있는 사이트  
 http://www.joinc.co.kr리눅스에서의 개발에 대한 많은 도움말이 있는 곳
 http://www.vim.org vi와 vim 에 대한 방대한 자료가 있는 곳


리눅스 C Compile 및 Make 사용법

이동: Home à os0103

 

주소: http://www.kernel.kr/os/01/os0103.htm

 

제목: 리눅스 C Compile 및 Make 사용법

저작권은 저자에게 있습니다

저자: 정재준(rgbi3307@nate.com)

최근수정일:2008-12-13

 

 

리눅스 C Compile 및 Make 사용법

1.       C 컴파일 방법

2.       라이브러리 생성 및 사용법

3.       Make 사용법

 

1. C 컴파일 방법

먼저, 아래와 같이 간단한 C 코드를 작성한다.

 

파일명: hello.c

 

#include

 

int main ()

{

    printf (“Hello Worldn”);

    exit(0);

}

 

위의 파일을 컴파일, 링크하여 실행한다.

$ cc –c hello.c  ß 컴파일

$ ll

 

-rw-rw-r--    1 jungjj   jungjj         79 12월 13 08:41 hello.c

-rw-rw-r--    1 jungjj   jungjj        840 12월 13 08:49 hello.o  ß object 코드 생성됨

 

$ cc -o hello hello.o  ß 링크

$ ll

 

-rwxrwxr-x    1 jungjj   jungjj      11638 12월 13 08:51 hello  ß 실행파일 생성됨

-rw-rw-r--    1 jungjj   jungjj         79 12월 13 08:41 hello.c

-rw-rw-r--    1 jungjj   jungjj        840 12월 13 08:49 hello.o

 

$ ./hello  ß 실행

Hello World

 

아래와 같이 컴파일과 링크를 한꺼번에 하여 실행파일을 생생할 수도 있다.

$ cc –o hello hello.c  ß 컴파일 및 링크하여 실행파일 생성

 

 

 

2. 라이브러리 생성 및 사용법

이번에는 C 코드파일을 여러 개 만들어서 object 코드를 생성하고 링킹하는 방법이다.  또한 서브코드를 라이브러리로 생성하여 링킹하는 방법에 대해서도 알아보자.

 

먼저, 아래와 같이 2개의 서브코드을 생성한다.

 

파일명: bill.c

#include

 

void bill (char* arg)

{

    printf (“bill: %sn”, arg);

}

 

파일명: fred.c

#include

 

void fred (char* arg)

{

    printf (“fred: %sn”, arg);

}

 

위의 서브코드를 컴파일하여 object 코드를 생성한다.

$ cc –c fred.c bill.c

$ ll *.o

 

-rw-rw-r--    1 jungjj   jungjj        788 12월 13 09:21 bill.o

-rw-rw-r--    1 jungjj   jungjj        788 12월 13 09:21 fred.o

 

 

위의 서브코드를 메인코드에서 사용하기 위하여, 헤더파일에 선언한다.

 

파일명: lib.h

 

void fred (char*);

void bill (char*);

 

 

메인코드에서 위의 헤더파일을 포함시키고, 서브코드 함수를 호출한다.

 

파일명: program.c

#include “lib.h”

 

int main ()

{

    bill (“hello”);

    fred (“hello”);

    exit(0);

}

 

메인코드를 컴파일하고, 서브코드 object와 링크하여 실행파일을 만든다.

 

$ cc -c program.c

$ cc -o program program.o bill.o fred.o

$ ll

 

-rw-rw-r--    1 jungjj   jungjj         78 12월 13 09:20 bill.c

-rw-rw-r--    1 jungjj   jungjj        788 12월 13 09:21 bill.o

-rw-rw-r--    1 jungjj   jungjj         82 12월 13 09:15 fred.c

-rw-rw-r--    1 jungjj   jungjj        788 12월 13 09:21 fred.o

-rw-rw-r--    1 jungjj   jungjj         41 12월 13 09:27 lib.h

-rwxrwxr-x    1 jungjj   jungjj      11912 12월 13 09:28 program  ß 실행파일 생성됨

-rw-rw-r--    1 jungjj   jungjj         78 12월 13 09:27 program.c

-rw-rw-r--    1 jungjj   jungjj        884 12월 13 09:28 program.o

$ ./program  ß 실행

bill: hello

fred: hello

 

 

이번에는 ar 프로그램을 사용하여 서브코드를 라이브러리 파일로 생성해 보자.  이때 ar 프로그램은 object 파일들을 합하여 archive 파일을 생성하는 역할을 한다.

 

$ ar crv lib_billfred.a bill.o fred.o

a - bill.o

a - fred.o

$ ll

 

-rw-rw-r--    1 jungjj   jungjj         78 12월 13 09:20 bill.c

-rw-rw-r--    1 jungjj   jungjj        788 12월 13 09:21 bill.o

-rw-rw-r--    1 jungjj   jungjj         82 12월 13 09:15 fred.c

-rw-rw-r--    1 jungjj   jungjj        788 12월 13 09:21 fred.o

-rw-rw-r--    1 jungjj   jungjj         41 12월 13 09:27 lib.h

-rw-rw-r--    1 jungjj   jungjj       1786 12월 13 09:34 lib_billfred.a  ß 라이브러리 파일 생성

-rwxrwxr-x    1 jungjj   jungjj      11912 12월 13 09:28 program

-rw-rw-r--    1 jungjj   jungjj         78 12월 13 09:27 program.c

-rw-rw-r--    1 jungjj   jungjj        884 12월 13 09:28 program.o

 

위에서 생성한 라이브러리 파일을 링크하여 실행파일을 생성하여 실행한다.

 

$ cc –o program program.o lib_billfred.a

$ ./program

bill: hello

fred: hello

 

 

위의 링크명령을 아래와 같이 사용해도 된다.  여기서 –L.는 라이브러리 파일의 위치가 현재 폴더에 있다는 의미이고, -l_billfred는 라이브러리 파일명을 의미한다.

 

$ cc -o program program.o -L. -l_billfred

$ ./program

bill: hello

fred: hello

 

 

리눅스에서는 사용하는 파일과 DOS 파일 명칭을 비교하면 아래와 같다.

 

파일구분

Linux/Unix

DOS

Object 모듈

func.o

FUNC.OBJ

공유 라이브러리

lib.so

LIB.DLL

정적 라이브러리

lib.a

lib.sa

LIB.LIB

실행 프로그램

program

PROGRAM.EXE

 

 

3. Make 사용법

이번에는 위에서 실습한 코드들을 make 파일을 사용하여 빌드해 보자.  먼저 아래와 같이 make 파일을 생성한다.

 

파일명: make_file1

myapp: program.o bill.o fred.o

         gcc -o myapp program.o bill.o fred.o

 

program.o: program.c lib.h

         gcc -c program.c

        

bill.o: bill.c

         gcc -c bill.c

        

fred.o: fred.c

         gcc -c fred.c

 

make 프로그램을 사용하여 위의 파일을 실행한다.

 

$ make -f make_file1

gcc -o myapp program.o bill.o fred.o

$ ll

 

-rw-rw-r--    1 jungjj   jungjj         78 12월 13 09:20 bill.c

-rw-rw-r--    1 jungjj   jungjj        788 12월 13 09:21 bill.o

-rw-rw-r--    1 jungjj   jungjj         82 12월 13 09:15 fred.c

-rw-rw-r--    1 jungjj   jungjj        788 12월 13 09:21 fred.o

-rw-rw-r--    1 jungjj   jungjj         41 12월 13 09:27 lib.h

-rw-rw-r--    1 jungjj   jungjj       1786 12월 13 09:34 lib_billfred.a

-rw-rw-r--    1 jungjj   jungjj        179 12월 13 10:08 make_file1

-rwxrwxr-x    1 jungjj   jungjj      11912 12월 13 10:09 myapp  ß 실행파일 생성됨

-rwxrwxr-x    1 jungjj   jungjj      11912 12월 13 09:41 program

-rw-rw-r--    1 jungjj   jungjj         78 12월 13 09:27 program.c

-rw-rw-r--    1 jungjj   jungjj        884 12월 13 09:28 program.o

 

$ ./myapp  ß 실행

bill: hello

fred: hello

 

지금까지 리눅스 환경에서 C 코드파일을 컴파일하고 링크하여 실행파일을 생성하는 방법을 간단히 기술 하였다.  아울러 make 파일을 통하여 빌드하는 방법에 대해서도 언급 하였다.

 

 

 

이동: Home à os0103

 

주소: http://www.kernel.kr/os/01/os0103.htm

 

제목: 리눅스 C Compile 및 Make 사용법

저작권은 저자에게 있습니다

저자: 정재준(rgbi3307@nate.com)

최근수정일:2008-12-13

 


목요일, 9월 10, 2009

[Linux] .vimrc

vi로 편집할 때 탭 대신에 space 4개를 쓰는 방법입니다.
자신의 홈디렉토리 .vimrc 화일에 다음과 같이 적으면 됩니다.
예전엔 마지막 줄은 몰랐었는데 마지막 줄이 없으면 autoindent하면서 줄의 맨 앞에 탭이 생깁니다. 또 맨 처음 탭에만 공백이 되고 두번째 탭부터는 다시 탭이 되더라구요...
맨 마지막 줄을 꼭 써 주어야 합니다. 맨 마지막 줄은 보이는 대로 입력하면 안 되구요, "map! " 요기까지 타이핑하고 control-v 누르고 control-v 다시 누르고 control-i 누릅니다. 그 다음 space 한번 치고 control-v, control-v, space, control-v, control-v, space, control-v, control-v, space, control-v, control-v, space 이렇게 하면 됩니다.

set visualbell
set shiftwidth=4
set tabstop=8
set softtabstop=4
set autoindent
map! ^V ^V ^V ^V ^V
set et

vim 에서 :retab 탭을 전부 스페이스로할때 .. 중요 (set et 랑 )
map :Tlist
map :BufExplorer

[Jaunty] 우분투 홈 디렉토리 로케일 변경

$ cd ~/.config
$ vi user-dirs.dirs

# This file is written by xdg-user-dirs-update
# If you want to change or add directories, just edit the line you're
# interested in. All local changes will be retained on the next run
# Format is XDG_xxx_DIR="$HOME/yyy", where yyy is a shell-escaped
# homedir-relative path, or XDG_xxx_DIR="/yyy", where /yyy is an
# absolute path. No other format is supported.
#
#XDG_DESKTOP_DIR="$HOME/바탕화면"
#XDG_DOWNLOAD_DIR="$HOME/바탕화면"
#XDG_TEMPLATES_DIR="$HOME/서식"
#XDG_PUBLICSHARE_DIR="$HOME/공용"
#XDG_DOCUMENTS_DIR="$HOME/문서"
#XDG_MUSIC_DIR="$HOME/음악"
#XDG_PICTURES_DIR="$HOME/그림"
#XDG_VIDEOS_DIR="$HOME/비디오"
#
XDG_DESKTOP_DIR="$HOME/Desktop"
XDG_DOWNLOAD_DIR="$HOME/Download"
XDG_TEMPLATES_DIR="$HOME/Templates"
XDG_PUBLICSHARE_DIR="$HOME/Share"
XDG_DOCUMENTS_DIR="$HOME/Documents"
XDG_MUSIC_DIR="$HOME/Music"
XDG_PICTURES_DIR="$HOME/Pictures"
XDG_VIDEOS_DIR="$HOME/Videos"

수요일, 9월 09, 2009

[Jaunty] Patch method

sudo patch -p0 < fix_kubuntu_docs.patch

[Jaunty] GPG Key

$ gpg --keyserver keyserver.ubuntu.com --recv FD9DDDFFD186C6FF
$ gpg --export --armor FD9DDDFFD186C6FF | sudo apt-key add -

[SKT] Image Work

Image Working
ssh -l root -X 220.103.228.129
rdesktop 172.18.86.18
(windows OS - Xen Center - Administrator/redhat!@#)
desktop - xen center click
xen server
172.18.86.17 - dev (root/redhat!@#)
172.18.86.19 - provisioning test (root/redhat!@#)
XenServer CLI - xe
xe vm-list
xe vm-import filename=/mnt/xenserver/GoldenMasterImage_RHEL5.3_64bit.xva
xe vm-import filename=/mnt/xenserver/GoldenMasterImage_WindowsServer2003_64bit.xva
xe vm-export uuid=1111-2222-3333-44444 filename=/mnt/xenserver/GoldenMasterImage_RHEL5.3_64bit.xva
chkconfig --list
network ip range
management: 192.168.1.x (it will be changed to 10.x.x.x later)
private: 172.18.86.x
public: 220.103.228.x

[SKT] 터널링

ssh -L5902:localhost:5902 root@220.103.228.129
ssh -L5901:localhost:5901 root@220.103.228.129
ssh -l root -X 220.103.228.129

[Jaunty] BlackJack Encoding

#!/bin/sh
mencoder $1.avi -o $1_bj.mp4 -sub $1.smi -oac lavc -ovc lavc -of lavf -lavcopts aglobal=1:vglobal=1:vcodec=mpeg4:acodec=libfaac:vbitrate=256:abitrate=64 -lavfopts format=mp4 -ofps 15 -vf scale=320:240,harddup
~/.mplayer/mencoder.conf
font = "/usr/share/fonts/truetype/unfonts/UnDotumBold.ttf"
subfont-text-scale=3
subcp=cp949

[SKT] GoldMaster Image Process

1. Linux (RHEL 5.3 64bit, OEL 5.2 64bit)
1.1 자원 할당
스토리지: 30G
네트웍: 3개 설정 (management:eth0, private:eth1, public:eth2 용도)
각 네트웍 인터페이스별 상세 IP 설정 및 대역 리스트(또는 조회 방법 과 규칙)
1.2 OS 설치
디스크 파티션
/boot xvda1 500M
swap xvda2 10G
/ xvda3 19.5G
패키지 설치
MySQL, PostgreSQL, Web Server 를 제외한 모든 패키지 설치
1.3 설정
네트웍 세팅
/etc/sysconfig/network-scripts/ifcfg-eth? 파일 수정
management 네트웍은 ONBOOT=yes 나머지는 ONBOOT=no
management 네트웍은 BOOTPROTO=dhcp
HWADDR 삭제
Para-virtualization driver 설치
VMWare: VMware Tools (설치후 vmware-config-tools.pl 실행)
XenServer: XenServer Tools
SKT 보안 설정
SSH on
iptables off
selinux disable (/etc/selinux/config)
1.4 RHEL 5.3 64bit
gcc 4.3.2 설치
gcc43-4.3.2-7.el5.x86_64.rpm
Oracle Clinet 설치
1.5 OEL 5.2 64bit
/etc/sudoers
Defaults requiretty 주석처리
libXp-1.0.0-8.1.el5.i386.rpm 설치
libXp-1.0.0-8.1.el5.x86_64.rpm 설치
2. Windows (Windows Server 2003 Enterprise R2 SP2, Windows Server 2008 Enterprise)
2.1 자원 할당
스토리지 (XenServer 에서의 추천값)
2003: 12G
2008: 24G
네트웍: 3개 설정 (management, private, public 용도)
2.2 OS 설치
디폴트
2.3 설정
linux-new 설치 (SW 설치 시, linux 명령어 사용)
바탕화면 아이콘 삭제
내 컴퓨터 > 등록정보 > 고급 > 환경변수에서 PROMPT를 $p$g로 변경
newsid.exe 파일 C:\ 에 복사 (sid 충돌 방지)
newsid.exe 한번 실행함 (newsid.exe 실행 시 EULA popup 방지)
Para-virtualization driver 설치
VMWare: VMware Tools
XenServer: XenServer Tools
SKT 보안 설정
RXA 설정
1. Remote Registry 서비스: 자동
2. 방화벽에서 135, 445 포트 접속 허용
3. Registry 수정
HKLM\System\CurrentControlSet\Services\LanManServer\Parameters
AutoShareServer 값을 1 로 수정

Ping 허용
방화벽 -> 파일프린터공유에코요청(ICMPv4-in) 허용
2.4 Windows Server 2008
.NET Framework 3.5 SP1 설치
Hot Fix 설치 (KB942288) => Windows Installer 4.5
IIS 7 설치
관리도구 > 서버 관리자 > 역할추가 를 통해 설치
관리도구 > 서비스 > World Wide Web Publishing Service > 시작유형: 수동
관리도구 > 서비스 > Web Process Activation Service > 시작유형: 수동
2.5 Windows Server 2003
IIS 6 설치
관리도구 > 사용자 서버 관리 > 역할추가 를 통해 설치
관리도구 > 서비스 > World Wide Web Publishing Service > 시작유형: 수동
관리도구 > 서비스 > IIS Admin Service > 시작유형: 수동

[SKT] TPM 7.1 Connection

ssh -l root -X 220.103.228.129
local에서 sudo ssh -a -N -f -L80:10.10.11.16:80 root@220.103.228.129
터널링 하시고
http://localhost/maximo
띄우시면 됩니당
maxadmin/maxadmin

[SKT] Management IP 설정

/etc/sysconfig/network-scripts/ifcfg-eth0
device=eth0
bootproto=none
broadcast=10.10.255.255
ipaddr=10.10.11.132
netmask=255.255.0.0
onBoot=yes
/etc/sysconfig/network 에서 hostname을 변경한다.
# echo 호스트명 > /proc/sys/kernel/hostname
으로 즉시 변경 가능

[Jaunty] Medibuntu 설정(코덱)

sudo wget http://www.medibuntu.org/sources.list.d/jaunty.list --output-document=/etc/apt/sources.list.d/medibuntu.list
sudo apt-get update && sudo apt-get install medibuntu-keyring && sudo apt-get update
sudo apt-get install w32codecs