- 정말 오래전에 정리해둔 파일을 발견, 웹에 옮겨 둔다.



gcc


-c : 컴파일만


-nostdinc / - nostdinc++ : 표준 헤더파일을 디렉토리를 검색하지 않는다.


-o : 출력파일 이름


-static : 정정 링크를 해서 실행파일을 만든다. 


-shared : 동적으로 링크


-soname : 동적 라이브러리를 만든다.


-O : 최적화 옵션


-S : 어셈블링을 하지 않는다 ( 어셈블 소스 코드 출력 )


-E : 프리프로세싱만 수행


-D : 매크로 디파인


-g : 디버깅 정보 포함


-ggdb : gdb전용 옵션 포함


-pg : profiling을 위한 정보 포함


-w : 모든 경고 메세지 억제


-Wall : gcc가 제공할 수 있고 유용한 모든 경고 메세지를 나타낸다


-werror : 모든 경고를 에러로 변환 컴파일을 중단한다


-pedantic : ANSI/ISO C 표준에서 요구되는 모든 경고를 나타낸다.


-pedantic-errors : ANSI/ISO C 표준에서 요구되는 모든 에러를 나타낸다.


-I : (대문자 i ) 헤더 파일을 검색하는 디렉토리 목록


-L : 라이브러리를 검색하는 디렉토리 목록


-l : (소문자 L) 함께 링크할 라이브러리


-nostdlib : 표준 라이브러리와 링크하지 않는다.


-V : 컴파일의 각 단계에서 사용하는 명령어를 보여준다.



.c : C언어 소스


.C .cc : C++ 소스


.i : 선행 처리된 C 소스


.ii : 선행처리된 C++ 소스


.S .s : 어셈블리어 소스


.o : 컴파일된 오브젝트


.a .so : 컴파일된 라이브러리




nm : nm [options] file

오브젝트나 바이너리에 인코딩된 모든 기호를 나열한다.

수행하는 함수 호출을 살펴보고, 라이브러리나 오•‹ㄱ트 파일에 필ㄹ요한 함수가 존재하는지 확인하는데 사용

-C : 기호 이름을 사용자 단계 이름으로 변환, 특히 C++ 함수 이름을 읽을 수 있도록 만드는데 유용


ar : ar [options] file

정적 라이브러리 파일을 생성한다

r : 기존에 존재하면 대체한다.

c : 경고를 생략하고 라이브러리를 생성한다.

s : 멤버에 링크하는 맵을 생성하거나 갱신 (???)

q : 대체를 확인하지 않고 마지막에 파일을 추가

d : 라이브러리에서 오브젝트를 삭제

t : 목록 출력


ranlib : ranlib [options] file

라이브러리 자체에 색인을 저장한다. (ar -s file과 동일 ??)


strip 

오브젝트 내의 심볼을 제거한다.


size



strings

파일내의 출력 가능한 문자들을 출력한다.


objcopy


objdump


ldd : ldd [options] file

file에 필요한 공유 라이브러리의 이름을 출력

-d 재배치를 수행하고 생략된 함수를 보고

-r 함수와 데이터 오브젝트를 위한 재배치를 수행하고 생략된 함수나 데이터 오브젝트를 보고


ldconfig : ldconfig [option] root_dir

/etc/ld.so.conf 에 지정된 공유 라이브러리를 위한 디렉토리 캐쉬 생성

ld.so ( 공유 라이브러리에 대한 링크 생성 관리를 위한 동적 링커/로더 )와 함께 동작한다.


-p : ld.so가 알고 있는 공유 라이브러리 디렉토리 (/etc/ld.so.cache)의 내용 출력

-v : 각 라이브러리의 버전 번호, 검색 디렉토리, 생성되거나 갱신되는 링크 나열 

/etc/ld.so.cache 갱신

-r : / (root)로 사용할 디렉토리를 지정


ld.so (동적 링커/로더)

$LD_LIBRARY_PATH - 공유 라이브러리 목록 (콜론으로 구분)

$LD_PRELOAD - 먼저 로드되는 추가적인 사용자 지정 공유 라이브러리의 목록 (공백으로 구분)

두개의 환경 변수를 사용한다.

/etc/ld.so.conf는 ld.so가 사용하는 설정 파일로 공유 라이브러리를 검색하는 디렉토리 목록

( /lib, /usr/lib 는 표준으로 포함하지 않는다. )

/etc/ld.so.preload 는 $LD_PRELOAD 환경 변수의 디스크 기번 버전이라네



* 공유 라이브러리 생성


1. 컴파일시에 -fPIC (Position Independent Code : 어던 주소에서 링크하고 로드할 수 있는 코드) 옵션을 사용


2. 오브젝트 파일에서 디버깅 기호를 저거하지 않고 gcc의 -fomit-frame-pointer 옵션을 사용하지 않는다.


3. gcc의 -shared  와 -soname 옵션을 사용한다.


4. ld에게 인수를 전달하기 위해서 gcc의 -W 옵션을 사용한다.


5. gcc의 -l (소문자 L)옵션을 사용하여 C 라이브럴에 대해 분명한 링크를 한다.


ex)

gcc -fPIC -g -c libMylib.c -o libMylib.o

gcc -g -shared -Wl,-soname,libMylib.so -o libMylib.so.1.0.0 libMylib.o -lc


이렇게 하면 libMylib.so.1.0.0이라는 공유 라이브러리가 생성된다.

링크시에 -lMylib 옵션으로 링크가 가능하게 하기위해 심볼릭 링크를 생성한다.


ln -s libMylib.so.1.0.0 libMylib.so




/lib 

/usr/lib


/usr/include

/usr/include/linux


/usr/i686-pc-linux-gnu/lib

/usr/i686-pc-linux-gnu/lib/ldscripts/

/usr/i686-pc-linux-gnu/gcc-bin/version/



'프로그래밍 > ' 카테고리의 다른 글

gdb를 이용한 리모트 디버깅  (0) 2015.04.15
Makefile 만들기  (0) 2014.06.24
Makefile  (0) 2013.11.27
Windows 7 에서 user32.dll, kernel32.dll, gdi32.dll 의 위치  (0) 2013.05.21
[wxWidgets] 설치 with mingw32-gcc  (0) 2011.12.17

.c.o:

gcc -c $<




%.o:%.c

gcc -c -o $@ $<




$< : 입력화일

$@ : 출력화일

$* : 입력 화일에서 확장자를 떼낸 화일명

$^ : 



DEBUG_OBJS = main_dbg.o edit_dbg.o



%_dbg.o:%c

gcc -c -g -o $@ $<


target_dbg: $(DEBUG_OBJS)

gcc -o $@ $(DEBUG_OBJS)





myprog: main.o foo.o

gcc -o $@ main.o foo.o



===>



OBJS = main.o foo.o


myprog:$(OBJS)

gcc -o $@ $(OBJS)




http://wiki.kldp.org/KoreanDoc/html/GNU-Make/GNU-Make-7.html



.SUFFIXES : .c .o


CC = gcc


INC_DIRS = -I/../.. <- include 되는 헤더 파일의 패스를 추가한다. (대문자 I)

LIBS = -lname <- 링크할 때 필요한 라이브러리를 추가한다. (소문자 L)

LIB_DIRS = -L/../.. <- 라이브러리 패스 (대문자 L)


CFLAGS = -Wall -g $(INCS) <- 컴파일에 필요한 각종 옵션을 추가한다.

LDFLAGS =


OBJS = <- 목적 파일의 이름을 적는다.

SRCS = <- 소스 파일의 이름을 적는다.


SRCS = $(foreach dir, ., $(wildcard $(dir)/*.c))

SRCS := $(notdir $(SRCS))

OBJS = $(SRCS:.c=.o)


TARGET = <- 링크 후에 생성될 실행 파일의 이름을 적는다.


all : $(TARGET)


$(TARGET) : $(OBJS)

                $(CC) $(LDFLAGS) -o $@ $^ $(LIBS)

                or

                $(CC) $(LDFLAGS) -o $@ $(OBJS) $(LIBS)


.c.o:
$(CC) $(CFLAGS) -c $< -c $@

dep :

                gccmakedep $(INC) $(SRCS)


clean :

                rm -rf $(OBJS) $(TARGET) core


new : 

                $(MAKE) clean 

                $(MAKE) 




http://www.korone.net/bbs/board.php?bo_table=etc_misc&wr_id=164&sca=Linux




mingw32 와 codeblock으로 win32 api 프로그램을 짜려니 시스템 함수들은 링크를 못 한다고 뜬다.


이유는 아마도 kernel/user/gdi 등의 라이브러리를 링크 시켜줘야 할듯...


그래서 이놈들이 어디있나 찾아보니  C:\Windows\SysWOW64 디렉토리에 있다고 나온다.


위 세개의 파일 말고도 다양한 dll이 존재하는데.. 아마도 32 빗 윈도 호환성에 관련된 파일들은


몽땅 이 디렉토리에 존재하는것 같다..


mfc40.dll, mfc42.dll, mfc71.dll 등도..


 



'프로그래밍 > ' 카테고리의 다른 글

gcc 툴체인 옵션 간단 정리  (0) 2014.04.16
Makefile  (0) 2013.11.27
[wxWidgets] 설치 with mingw32-gcc  (0) 2011.12.17
lex 프로그램의 입력 문제  (0) 2010.11.05
lex 와 yacc 간단 짤막 요약~  (0) 2010.10.28
stable 버전이라고해서 2.8.12를 받아다 빌드를 시도 했더니
계속 memory exhausted 에러가 발생했다.

해결하려고 여러가지 시도를 해봤으나 계속 실패하고
결국 개발 버전 (2.9.3)을 빌드하니 깨끗하게 성공!!!

컴파일러는 http://tdm-gcc.tdragon.net/download 을 사용했다.

%%
2.8.12에서는 memory exhausted 에러, liblibunicows.a 가 없다는 에러가 발생  함


빌드 방법으로는

wxWidgets-2.9.3/build/msw 디렉토리에서

mingw32-make -f makefile.gcc MONOLITHIC=1 SHARED=1 UNICODE=1 BUILD=release clean
mingw32-make -f makefile.gcc MONOLITHIC=1 SHARED=1 UNICODE=1 BUILD=release

mingw32-make -f makefile.gcc MONOLITHIC=1 SHARED=1 UNICODE=1 BUILD=debug clean
mingw32-make -f makefile.gcc MONOLITHIC=1 SHARED=1 UNICODE=1 BUILD=debug

mingw32-make -f makefile.gcc MONOLITHIC=1 SHARED=1 UNICODE=1 samples 요건 샘플들


wxWidgets-2.9.3/demos, wxWidgets-2.9.3/utils 디렉토리에서도 마찬가지로

mingw32-make -f makefile.gcc MONOLITHIC=1 SHARED=1 UNICODE=1

해주면 빌드가 깨끗하게 된다.




'프로그래밍 > ' 카테고리의 다른 글

Makefile  (0) 2013.11.27
Windows 7 에서 user32.dll, kernel32.dll, gdi32.dll 의 위치  (0) 2013.05.21
lex 프로그램의 입력 문제  (0) 2010.11.05
lex 와 yacc 간단 짤막 요약~  (0) 2010.10.28
소스코드 html로 꾸미기  (0) 2010.09.27
요즘 lex와 yacc를 공부하고있는데 
간단한 lex 테스트 프로그램이 의도한 대로 동작하지 않아서 개 삽질... 으..


입력된 내용중 단어와 숫자를 구분하여 출력하는 정말 심플한 코드다.
그런데 전혀 예상밖의 결과가 나온다..

WORDS : T
WORDS : a
WORDS : g
WORDS : l
....
WORDS : t
WORDS : o
WORDS : n
NUMBERS : 2

대충 뭐 이런..
파일을 오픈해서 읽어도 그러고 리 다이렉션을 해도 그런다.
이 문제로 한참을 씨름했는데.. 손댈 구석이 있어야 뭘 어떻게 해보지..
그러던 중 문득 시도해본 stdin을 통한 입력..

잘. 된. 다.

뭐냐...
이유는 아직도 모르겠다.... 대체 뭐가 문제인지...
이유를 모르니 해결책도 모르겠고..
시작부터 삽질의 연속이구나.. 아흐~


glibc : 2.11.2
flex : 2.5.35
gcc 4.4.3

에서 테스트


+ Recent posts