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년 8월 26일 화요일
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 에 기본으로 들어 온거 같습니다.
예)
set PATH=%PATH%;c:\mingw\bin
mongoose.c 와 mongoose.h 파일을 소스 폴더에 복사하고 아래와 같이 컴파일 합니다.
g++ -o server.exe mongoose.c main.c -lmingw32 -lwsock32
pthread 는 언제 부턴가 mingw 에 기본으로 들어 온거 같습니다.
- -lpthread 옵션이 필요 없네요
예)
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
#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 /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
폴더 구조:
- 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
- /Iinclude : include 폴더를 include path 에 추가
- /MDd : Multithread-specific and DLL-specific 이라고 하는데 잘 모름 (참고 - http://msdn.microsoft.com/en-us/library/2kzt1wy3.aspx)
- /O2 : Optimize Code (참고 - http://msdn.microsoft.com/en-us/library/k1ack8f1.aspx)
- /EHsc :Exception Handling model (참고 - http://msdn.microsoft.com/en-us/library/1deeycx5.aspx)
- /DEBUG:yes : Generate debug info (참고 - http://msdn.microsoft.com/en-us/library/xe4t6fc1.aspx)
- /link : linker 옵션 (lib 파일들을 나열)
- /SUBSYSTEM:CONSOLE : subsystem (참고 - http://msdn.microsoft.com/en-us/library/fcc1zstk.aspx)
- /NODEFAULTLIB:msvcrt.lib : Ignore libraries (참고 - http://msdn.microsoft.com/en-us/library/3tz4da4a.aspx)
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 를 추가한다.
하지만 개중에 빌드해야하는 것들이 있다.
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) 함수를 이용한다.
예)
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);
}
피드 구독하기:
글 (Atom)