레이블이 팁인 게시물을 표시합니다. 모든 게시물 표시
레이블이 팁인 게시물을 표시합니다. 모든 게시물 표시

2014년 8월 26일 화요일

pkg-config 간단 사용법

apt-get 등으로 library 는 설치했는데 컴파일에 필요한 header 파일 들과 .so 파일들이 어디 있는지 찾기 힘드셨죠?

gcc 옵션에 -I (대문자 i) 는 header 파일들이 위치한 폴더를 지정하고 -L 은 lib 파일들이 위치한 폴더를 지정하고 -l (소문자 L) 은 특정 .so 파일을 지정합니다.

pkg-config 를 이용해서 설치된 library 들의 목록과 위 compile 옵션에 추가할 값들을 손쉽게 얻을 수 있습니다.



이미 설치되어 있는 경우가 대부분이겠지만 그렇지 않다면 아래와 같이 설치 하실 수 있습니다.
$ sudo apt-get install pkg-config


1. 설치된 library 목록 확인


$ pkg-config --list-all
shared-mime-info               shared-mime-info - Freedesktop common MIME database
gmodule-no-export-2.0          GModule - Dynamic module loader for GLib
ncurses++                      ncurses++ - ncurses 5.9 add-on library
form                           form - ncurses 5.9 add-on library
pthread-stubs                  pthread stubs - Stubs missing from libc for standard pthread functions
xt                             Xt - X Toolkit Library
xtrans                         XTrans - Abstract network code for X
gnome-icon-theme               gnome-icon-theme - A collection of icons used as the basis for GNOME themes
menu                           menu - ncurses 5.9 add-on library
xdmcp                          Xdmcp - X Display Manager Control Protocol library
libpcreposix                   libpcreposix - PCREPosix - Posix compatible interface to libpcre
tic                            tic - ncurses 5.9 add-on library
gio-unix-2.0                   GIO unix specific APIs - unix specific headers for glib I/O library
gupnp-1.0                      gupnp-1.0 - GObject-based UPnP library
kbproto                        KBProto - KB extension headers
pm-utils                       pm-utils - Power management scripts for suspend and hibernate
zlib                           zlib - zlib compression library
...


grep 을 이용해서 원하는 library 가 설치되었는지 확인 할 수 있겠죠?

$ pkg-config --list-all | grep glib
gio-unix-2.0                   GIO unix specific APIs - unix specific headers for glib I/O library
gio-2.0                        GIO - glib I/O library
libsoup-2.4                    libsoup - a glib-based HTTP library
glib-2.0                       GLib - C Utility Library


2. --cflags

$ pkg-config --cflags glib-2.0
-I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include


3. --libs 

$ pkg-config --libs glib-2.0
-lglib-2.0


4. 컴파일에 적용

main.c: glib 을 이용한 아주 간단한 프로그램

#include <unistd.h>
#include <glib.h>

int main(int argc, char * args[]) {

    g_print("Hello Glib!\n");
   
    return 0;
}


compile:

$ gcc -o test main.c `pkg-config --cflags --libs glib-2.0`

아래와 같이 일일이 입력하지 않아도 되니 편합니다.

$ gcc -o test main.c -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -lglib-2.0

실행:

$ ./test
Hello Glib!


5. 팁

한번에 여러 라이브러리 지정도 가능합니다.

$ pkg-config --cflags --libs glib-2.0 zlib jansson
-I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include  -lglib-2.0 -lz -ljansson


2014년 4월 24일 목요일

mongoose + mingw

참고: http://www.8bitrobot.com/2013/08/14/How-to-compile-Mongoose-HTTP-server-on-mingw/

mongoose.c 와 mongoose.h 파일을 소스 폴더에 복사하고 아래와 같이 컴파일 합니다.

g++ -o server.exe mongoose.c main.c -lmingw32 -lwsock32

pthread 는 언제 부턴가 mingw 에 기본으로 들어 온거 같습니다.
  • -lpthread 옵션이 필요 없네요
mingw 설치 폴더의 bin 폴더를 path 환경 변수에 추가해 주면 실행할 때 도움이 되겠네요.
예)
set PATH=%PATH%;c:\mingw\bin



2014년 3월 23일 일요일

SDL compile with cl (msvc 2010 express)

libsdl 1.2 : http://www.libsdl.org/download-1.2.php

폴더 구조:
  • test.c : sample 소스 코드
  • build.bat : build 스크립트
  • include/ : SDL header 파일들 (SDL.h 등)
  • lib/x64/SDL.lib
  • lib/x64/SDLmain.lib
  • lib/x86 /SDL.lib
  • lib/x86/SDLmain.lib
  • SDL.dll : 프로그램 실행시 필요한 dll 파일

test.c
#include <stdio.h>
#include <SDL.h>

int main(int argc, char * args[]) {
  printf("Hello SDL\n");
  SDL_Init(SDL_INIT_EVERYTHING);
  SDL_Quit();
}


build.bat
@echo off
call "C:\Program Files\Microsoft Visual Studio 10.0\VC\vcvarsall.bat"
cl /Iinclude /MDd /O2 /EHsc /Zi /DEBUG:yes test.c /link lib\x86\SDL.lib\ lib\x86\SDLmain.lib /SUBSYSTEM:CONSOLE /NODEFAULTLIB:msvcrt.lib


설명:
call "C:\Program Files\Microsoft Visual Studio 10.0\VC\vcvarsall.bat"
  • 개발 환경 설정 (이걸 실행해 줘야 cl 컴파일러를 사용할 수 있다)
  • msvc 가 설치된 경로가 다르면 변경

cl /Iinclude /MDd /O2 /EHsc /Zi /DEBUG:yes main.c list.c cmd.c /link lib\x86\SDL.lib\ lib\x86\SDLmain.lib /SUBSYSTEM:CONSOLE /NODEFAULTLIB:msvcrt.lib

2012년 4월 5일 목요일

boost 사용

boost 는 대부분 header 파일만 존재한다. 고로 링크할 필요없다.

하지만 개중에 빌드해야하는 것들이 있다.

regex 를 예로 설명 (boost 1.44 기준)
visual studio 2008(ver. 9.0) 를 사용했다.
참조 - http://www.boost.org/doc/libs/1_44_0/more/getting_started/windows.html#link-your-program-to-a-boost-library
1. cmd 를 실행한다.
2. <visual studio home>\VC\bin\vcvars32.bat 를 실행한다.
3. <boost_home>\libs\regex\build 으로 이동한다.
4. nmake -fvc9.mak 를 실행하여 빌드한다.
5. nmake -fvc9.mak install 을 실행하면 .lib 파일들이 visual studio 라이브러리 폴더로 들어간다.

문제점
1. 빌드하는데 libboost_regex-vc90-mt-sgd-1_44.lib 를 찾을 수 없다는 에러가 발생
- 빌드한 파일명을 확인해보니 libboost_regex-vc90-mt-sgd-1_42.lib 이었다.
- auto link 를 막고 빌드된 라이브러리를 직접 링크했다.
- preprocessor definitions 에 BOOST_REGEX_NO_LIB 를 추가한다.
- http://sunghwa82.tistory.com/entry/Boost-Library-%EC%84%A4%EC%B9%98%EB%B0%A9%EB%B2%95-C 의 5. 2) 항목 참조
- additional dependencies 에 libboost_regex-vc90-mt-sgd-1_42.lib 를 추가한다.

2012년 3월 9일 금요일

mingw 와 cygwin 차이점

mingw 는 윈도 API 를 사용해서 윈도 프로그램을 만들 때 사용한다.
cygwin 은 리눅스 라이브러리를 윈도에 에뮬레이션한 라이브러리를 이용하여 윈도에서 리눅스 프로그래밍을 할 수 있게 해준다.

윈도 프로그래밍을 해야 하면 mingw 를 사용하고 윈도에서 리눅스 프로그래밍을 해야 하면 cygwin 을 사용한다.

2012년 1월 24일 화요일

current working directory 얻기

direct.h 를 include 한다.
mac 에서는 unistd.h 을 include 한다.

getcwd(char*, int) 함수를 이용한다.

예)

#include <direct.h>

int main(int argc, char* args[]) {
 char cwd[256];
 getcwd(cwd, 256);
 printf("cwd:%s\n", cwd);
}