반응형

usb to serial 장비 연결 시 장치관리자에서 장비 포트를 com1, com2로 설정해야 한다.

그 외에는 설정할 수 없다.

반응형

출처: http://icetel.blogspot.kr/2011/02/everything.html

 

장점: 엄청 빠른 검색이 장점

단점: 처음 실행할 때 약간 느림

 

 

* Everything은 NTFS 파일시스템만 지원합니다. http://goo.gl/3gfGn
NTFS로 변환하기 http://goo.gl/SLpNa

EveryThing 홈페이지(영어, 한글, 중국어 지원) : http://goo.gl/YQ8Ww
다운로드(설치) : http://goo.gl/mp019 다운로드(포터블) : http://goo.gl/PYBmW
언어팩 : http://goo.gl/YKHB9

'PC > 유틸' 카테고리의 다른 글

윈도우에서 안드로이드 앱 실행하는 방법  (0) 2020.10.14
무료 순서도 프로그램  (0) 2019.01.13
파일 탐색기용, 검색용  (0) 2018.08.20
업무 유용 프로그램  (0) 2018.08.20
반응형


1. 아웃룩 옵션->메일->메시지 작성->작성할 메시지 형식의 종류를 선택하여 첨부파일 첨부방법을 선택할 수 있다.

   - HTML:  별도의 칸에 첨부파일이 보인다.

   - 서식 있는 텍스트: 메일 본문에 첨부가 붙습니다.  

'문서 편집 > OUTLOOK' 카테고리의 다른 글

아웃룩 저장 위치 이동  (0) 2020.11.30
대화 보기  (0) 2016.01.19
아웃룩 폴더 삭제  (0) 2014.05.19
아웃룩으로 전화걸기  (0) 2014.02.21
첨부 파일 빼먹고 메일 보내는 실수 방지 방법  (0) 2013.01.17
반응형

참조: 

 설명 사이트: http://apedix.tistory.com/2117

 원본 사이트: http://www.codetwo.com/freeware/outlook-attachment-reminder/

'문서 편집 > OUTLOOK' 카테고리의 다른 글

아웃룩 저장 위치 이동  (0) 2020.11.30
대화 보기  (0) 2016.01.19
아웃룩 폴더 삭제  (0) 2014.05.19
아웃룩으로 전화걸기  (0) 2014.02.21
첨부파일 첨부하는 방법 2가지  (0) 2013.01.17
반응형
char i[2][3];

printf("i[2][3]:%d\n",sizeof(i));

결과: i[2][3]:6


'language > C' 카테고리의 다른 글

C 언어와 C++ 언어에서 const 처리  (0) 2015.03.16
long long 입출력 관련  (0) 2015.01.28
printf format string  (0) 2012.01.18
gcc option  (0) 2011.10.26
callback 함수  (0) 2011.10.06
반응형
http://itguru.tistory.com/64
http://en.wikipedia.org/wiki/Printf_format_string



fprintf

#include <stdio.h> // C++ 에서는 <cstdio>

int fprintf ( FILE * stream, const char * format, ... );

데이터를 형식에 맞추어 스트림에 쓴다. 
특정한 스트림에 일련의 데이터를 특정한 형식에 맞추어 쓰게 된다. 이 때, 그 형식은 형식 문자열에 지정되어 있으며, 출력할 데이터는 형식 문자열 다음에 오는 인자들에 써주면 된다. 

   인자
 

stream

작업을 수행할 스트림의 FILE 객체 

format

C 문자열로 스트림에 써질 텍스트를 포함하고 있다.
또한 이 문자열에는 형식 태그를 부수적으로 포함할 수 있는데 이는 각각의 형식 태그에 대응되는 인자의 데이터가 형식 태그가 지정하는대로 치환된다. 
따라서, 이 문자열에 포함되어 있는 형식 태그의 수는 뒤에 부수적으로 오는 인자의 개수 보다 언제나 같거나 적어야 한다. 
 
형식 태그는 다음과 같은 꼴로 써야 한다. 

%[플래그(flag)][폭 (width)][.정밀도][크기(length)]서식 문자(specifier)

이 때, 형식 태그에서 가장 중요한 부분은 서식 문자로 이는 이 형식 태그에 대응되는 인자의 값이 어떠한 형태로 출력되는지를 조정해 준다. 

서식문자출력 형태

c 문자
a
d or i 부호 있는 십진법으로 나타난 정수 392
e 지수 표기법(Scientific notation) 으로 출력하되, e 문자를 이용한다. 
3.9265e+2
E 지수 표기법(Scientific notation) 으로 출력하되, E 문자를 이용한다. 3.9265E+2
f 십진법으로 나타낸 부동 소수점 수 392.65
g %e나 %f 보다 간략하게 출력 392.65
G %E나 %f 보다 간략하게 출력 392.65
o 부호 있는 팔진수
610
s 문자열
sample
u 부호없는 십진법으로 나타낸 정수
7235
x 부호없는 16 진법으로 나타낸 정수 (소문자 사용)
7fa
X 부호없는 16 진법으로 나타낸 정수 (대문자 사용)
7FA
p 포인터 주소
B800:0000
n 아무것도 출력하지 않는다. 그 대신, 인자로 부호 있는 int 형을 가리키는 포인터를 전달해야 되는데, 여기에 현재까지 쓰여진 문자 수가 저장된다.
% % 다음에 %를 또 붙이면 stdout 에 % 를 출력한다. 


  • 위 서식 문자를 이용한 다양한 출력 형태는 아래와 같다.

  • #include <stdio.h>
    int main()
    {
        FILE *fp = fopen("output.txt", "w");
        int integer = 123;
        char character = 'c';
        char string[] = "hello, world";
        int* pointer = &integer;
        double pi = 3.141592;

        fprintf(fp, "integer : (decimal) %d (octal) %o \n", integer, integer);

        fprintf(fp, "character : %c \n", character);

        fprintf(fp, "string : %s \n", string);

        fprintf(fp, "pointer addr : %p \n", pointer);

        fprintf(fp, "floating point : %e // %f \n", pi, pi);

        fprintf(fp, "percent symbol : %% \n");

        return 0;


  • 출력 결과




  • 파일의 모습



    output.txt 에 우리가 형식 문자열에서 지정해준대로 잘 표시되었음을 알 수 있다. 또한, 콘솔에는 출력을 하지 않았으므로 콘솔에는 아무것도 표시되지 않았다.

    형식 태그에는 위 말고도 플래그, 폭, .정확도, 제한자(modifier), 부-서식문자(sub-specifiers) 에 관련한 정보들이 포함될 수 있다. 먼저 플래그를 살펴보면 플래그는 기본적으로 출력되는 형태에 대해 조금 더 자세하게 지정할 수 있게 해준다. 플래그는 아래와 같다. 

    플래그설명
    - 폭에 맞추어 왼쪽 정렬을 하여 출력한다. - 를 붙이지 않는다면 기본적으로 오른쪽 정렬이 되어 출력한다. (아래 폭 지정자 참조).
    + 출력 결과값이 양수인 경우라도 + 기호를 앞에 붙여서 출력하도록 한다. (물론 음수면 자동적으로 - 가 붙는다). 기본적으로 지정하지 않았을 경우 음수에만 앞에 - 가 붙는다. 
    (공 백) 앞에 부호가 붙지 않는다면 한 칸을 띄어서 출력한다. (다시말해 123 은 " 123" 으로 출력되고 -123 은 "-123" 으로 출력된다)
    #
    o, x, X 서식 문자들과 사용되면 출력되는 값 앞에 각각 0, 0x, 0X 가 붙게 된다. (이 때 0 은 제외한다)
    e, E, f 서식 문자들과 사용되면 소수점 아래 수들이 없음에도 불구하고 강제적으로 소수점을 붙이도록 한다. 원래 소수점 아래 수들이 없다면 소수점을 붙이지 않는다. 
    g 와 G 서식 문자들과 사용되면 e 와 E 일때와 동일한 작업을 하지만 소수들의 뒷부분에 붙는 0 들 (123.1200 등) 은 제거되지 않는다. 
    0 수들을 왼쪽으로 정렬하되 빈 칸을 삽입하는 대신에 0 을 삽입한다. (폭 지정자 참조)

  •   폭은 말그대로 출력되는 데이터의 폭을 지정해준다. 참고로 여기서의 폭(width)은 뒤에 나오는 길이(length) 와는 완전히 다른 개념이므로 유의 하시기 바란다. 


  • 설 명
    (수) 출력할 최소의 문자 개수. 만일 이 수 보다 출력할 수 보다 작다면 빈칸을 삽입하여 길이를 맞춘다. 대신에, 이 수 보다 출력할 수가 큰 수의 경우 잘려서 출력되지는 않는다. 
    * 폭을 형식 문자열에 지정해서 받지 않지만, 그 대신에 형식 문자열 뒤에 오는 인자들에 넣어서 받는다. 이 때, 이는 정수 값이여야 하며 폭을 지정하는 변수 뒤에 출력할 데이터가 위치하면 된다. 

  • /* 사용 예 */
    #include <stdio.h>
    int main()
    {
        FILE *fp = fopen("output.txt", "w");
        int i = 123;
        int j = -123;
        double f = 3.141592;

        fprintf(fp, "폭 맞추기 \n");
        fprintf(fp, "i : %6d \n", i);
        fprintf(fp, "i : %7d \n", i);
        fprintf(fp, "i : %2d \n\n", i);

        fprintf(fp, "왼쪽 정렬 \n");
        fprintf(fp, "i : %5d끝 \n", i);
        fprintf(fp, "오른쪽 정렬 \n");
        fprintf(fp, "i : %-5d끝 \n\n", i);

        fprintf(fp, "# 문자의 사용 \n");
        fprintf(fp, "i : %#x \n", i);
        fprintf(fp, "i : %#X \n\n", i);

        fprintf(fp, "부호 붙이기 \n");
        fprintf(fp, "%+d, %+d \n", i,j);
        return 0;
    }

  • 출력 결과

  • 파일에 출력된 모습

  • 이전의 예제와 같이 output.txt 에 우리가 지정한 방식대로 잘 출력되었음을 볼 수 있다. 
    정밀도는 말그대로 수치 데이터를 출력할 때 어떠한 정밀도로 출력하는지 (즉, 몇 자리 까지 출력해야 되는지) 를 지정해준다. 참고적으로 정밀도를 나타낼 때, 앞에 꼭 마침표(.) 을 찍는 것을 잊지 말기 바란다. 마침표를 찍는 이유는 앞에 폭과 구분을 하기 위해서 이다. 

  • . 정밀도설명
    .숫자 정수 지정자 (d,i,o,u,x,X) 의 경우 : 정밀도는 출력되야할 최소의 자리수를 일컫는다. 만일, 어떤 정수의 자리수가 정밀도 보다 작다면 앞에 0 이 붙어서 자리수를 맞추게 된다. 또한 자리수가 더 크다고 해서 정수를 잘라서 출력하지는 않는다. 만일 정밀도가 0 이라면, 소수점 뒤에 자리수를 출력하지 않는다.
    e,E, F 의 경우 : 여기서 정밀도는 소수점 이하 출력될 자리수를 의미한다. 
    g, G 의 경우 : 출력될 유효 숫자의 수를 의미한다.
    s 의 경우 : 출력될 문자의 최대 개수를 의미한다. 원래는 널 문자를 만나기 전까지 모든 문자가 출력되었었다.
    c 의 경우 : 아무 효과 없다.
    만일 정밀도가 지정되지 않는다면 기본값으로 1 이 된다. 또한, 마침표(.) 을 찍었는데 아무런 숫자를 적지 않았다면 기본적으로 0 이 적혔다고 생각한다. 
    .* 형식 문자열에서 정밀도를 나타내지는 않지만 뒤에 인자로 정밀도 값을 준다. 이 때 인자는 형식 태그가 적용되는 데이타 앞에 있어야 한다.  

       길이는 출력하는 데이터의 정확한 크기를 지정하는데 사용된다. 예를 들어서 %d 서식문자의 경우 막연하게 '정수형 데이터를 십진법으로 출력한다' 였지만 길이를 지정해주면 어떻나 크기로 데이터를 출력해야되는지 (int 냐 short 냐 등등) 을 지정할 수 있다. 

  • 길이
    설 명
    h 인자를 short int 혹은 unsigned short int 로 생각한다. (오직 i, d, o, u , x, X 서식 문자에만 적용된다)
    l 정수 서식 문자(i,d,o,u,x, X) 에 사용되었을 경우 인자를 long int 나 unsigned long int 로 생각하며 c 나 s 에 사용되었을 경우 wide character 나 wide string 으로 생각한다.
    L 인자를 long double 로 생각한다. (오직 부동 소수점 서식 문자인 e,E,f,g, G 에만 적용된다)

  • /* 사용 예 */
    #include <stdio.h>
    int main()
    {
        double f = 3.141592;
        int i = 12345;

        fprintf(stdout, "f : %.3f \n", f);
        fprintf(stdout, "i : %.10d \n", i);

        return 0;


    출 력 결과


    이번에는 파일 스트림에 출력하는 것이 아니라 표준 출력(stdout), 즉 콘솔 화면에 출력을 해 보았다. 역시 우리가 지정한 형식대로 잘 출력된다. 

    부수적인 인자


    형식 문자열에 따라 함수는 여러 인자들을 가지며, 각 인자는 형식 문자열의 각 형식 태그에 순차적으로 대응된다. 기본적으로 형식 문자열에 들어 있는 형식 태그의 수와 뒤따라 붙는 인자들의 수는 같아야 한다. (물론 .* 이나 * 과 같은 예외적인 상황은 제외한다)

       리턴값
     

    출력 성공시, 화면에 출력된 총 문자의 개수를 반환한다.
    실패했다면 음수가 반환된다.

       실행 예제
     

    /* 

    사용자로 부터 이름을 입력받아 이를 깔끔하게 myfile.txt 에 기록한다.
    이 예제는 http://www.cplusplus.com/reference/clibrary/cstdio/fprintf/
    에서 가져왔습니다. 

     */
    #include <stdio.h>
    int main ()
    {
        FILE * pFile;
        int n;
        char name [100];

        pFile = fopen ("myfile.txt","w");
        for (n=0 ; n<3 ; n++)
        {
            puts ("please, enter a name: ");
            gets (name);
            fprintf (pFile, "Name %d [%-10.10s]\n",n,name);
        }
        fclose (pFile);

        return 0;
    }


    실행 결과


    파일에 출력된 모습


    fprintf 에서 사용한 형식 문자열에 대해 설명을 하자면

    %-10.10s

    먼저 봐야 할 것은 서식 문자인데, s 는 데이터를 문자열로 출력하라는 것이다. 맨 앞의 - 는 문자열을 "왼쪽 정렬" 해서 출력하라는 의미 이다. 그 뒤에 10 은 최소 10 개의 문자를 출력하라는 뜻으로 길이가 10 미만인 문자열은 공백으로 길이를 맞춘다. Psi 다음에 쭉 위치한 공백이 그것이다. 그리고 .10 은 최대 10 문자를 출력하라는 뜻으로 10 문자가 넘으면 잘리게 된다. 위에 Genious Psi 가 잘려서 Genious Ps 까지 출력된 것을 볼 수 있다. 

       연관된 함수
     

    • printf  :  특정한 형식에 맞추어 데이터를 stdout 에 출력한다.
    • fscanf  :  특정한 형식에 맞추어 스트림에서 데이터를 읽어온다.
    • fwrite  :  스트림에 데이터 블록을 쓴다.
    • fputs  :  스트림에 문자열을 쓴다.

    'language > C' 카테고리의 다른 글

    long long 입출력 관련  (0) 2015.01.28
    2차원 배열 크기 구하기  (0) 2013.01.15
    gcc option  (0) 2011.10.26
    callback 함수  (0) 2011.10.06
    데이터 타입  (0) 2011.07.14
    반응형
    반응형

    출처 : http://www.joinc.co.kr/modules/moniwiki/wiki.php/article_library_%B8%B8%B5%E9%B1%E2


     

     

     

     

    library 의 사용

    윤 상배

    yundream@coconut.co.kr

    1절. 소개

    이 문서는 library 의 사용방법에 대한 내용을 담고 있다. 왜 라이브러리가 필요한지, 라이브러리는 어떤 종류가 있으며, 어떻게 작성할수 있는지, 그리고 어떻게 사용하는지에 대해서 얘기하도록 할것이다. 그리고 중간중간에 이해를 돕기 위한 실제 코딩역시 들어갈 것이다.

    라이브러리에 대한 이러저러한 세부적인 내용까지 다루진 않을것이다. 좀더 이론적인 내용을 필요로 한다면 Program Library HOWTO 를 참고하기 바란다. 이 문서에서는 라이브러리를 만들고 활용하는 면에 중점을 둘것이다. 그러므로 위의 문서는 이문서를 읽기전에 대충이라도 한번 읽어보도록 한다.

    정적 라이브러리와 공유라이브러리는 일반적인 내용임으로 간단한 설명과 일반적인 예제를 드는 정도로 넘어갈 것이다. 그러나 동적라이브러리에 대해서는 몇가지 다루어야할 이슈들이 있음으로 다른 것들에 비해서 좀더 비중있게 다루게 될것이다.

    2절. Library 이야기

    2.1절. 라이브러리란 무엇인가

    라이브러리란 특정한 코드(함수 혹은 클래스)를 포함하고 있는 컴파일된 파일이다. 이러한 라이브러리를 만드는 이유는 자주 사용되는 특정한 기능을 main 함수에서 분리시켜 놓음으로써, 프로그램을 유지, 디버깅을 쉽게하고 컴파일 시간을 좀더 빠르게 할수 있기 때문이다.

    만약 라이브러리를 만들지 않고 모든 함수를 main 에 집어 넣는다면, 수정할때 마다 main 코드를 수정해야 하고 다시 컴파일 해야 할것이다. 당연히 수정하기도 어렵고 컴파일에도 많은 시간이 걸린다.

    반면 라이브러리화 해두면 우리는 해당 라이브러리만 다시 컴파일 시켜서 main 함수와 링크 시켜주면 된다. 시간도 아낄뿐더러 수정하기도 매우 쉽다.

    2.2절. 라이브러리의 종류

    라이브러리에도 그 쓰임새에 따라서 여러가지 종류가 있다(크게 3가지). 가장 흔하게 쓰일수 있는 "정적라이브러리"와 "공유라이브러리", "동적라이브러리" 가 있다.

    이들 라이브러리가 서로 구분되어지는 특징은 적재 시간이 될것이다.

    정적라이브러리

    정적라이브러리는 object file(.o로 끝나는) 의 단순한 모음이다. 정적라이브러린느 보통 .a 의 확장자를 가진다. 간단히 사용할수 있다. 컴파일시 적재되므로 유연성이 떨어진다. 최근에는 정적라이브러리는 지양되고 있는 추세이다. 컴파일시 적재되므로 아무래도 바이너리크기가 약간 커지는 문제가 있을것이다.

    공유라이브러리

    공유라이브러리는 프로그램이 시작될때 적재된다. 만약 하나의 프로그램이 실행되어서 공유라이브러리를 사용했다면, 그뒤에 공유라이브러리를 사용하는 모든 프로그램은 자동적으로 만들어져 있는 공유라이브러리를 사용하게 된다. 그럼으로써 우리는 좀더 유연한 프로그램을 만들수 잇게 된다.

    정적라이브러리와 달리 라이브러리가 컴파일시 적재되지 않으므로 프로그램의 사이즈 자체는 작아지지만 이론상으로 봤을때, 라이브러리를 적재하는 시간이 필요할것이므로 정적라이브러리를 사용한 프로그램보다는 1-5% 정도 느려질수 있다. 하지만 보통은 이러한 느림을 느낄수는 없을것이다.

    동적라이브러리

    공유라이브러리가 프로그램이 시작될때 적재되는 반면 이것은 프로그램시작중 특정한때에 적재되는 라이브러리이다. 플러그인 모듈등을 구현할때 적합하다. 설정파일등에 읽어들인 라이브러리를 등록시키고 원하는 라이브러리를 실행시키게 하는등의 매우 유연하게 작동하는 프로그램을 만들고자 할때 유용하다.

    2.2.1절. 왜 정적라이브러리의 사용을 지양하는가

    예전에 libz 라는 라이브러리에 보안 문제가 생겨서 한창 시끄러웠던적이 있다. libz 라이브러리는 각종 서버프로그램에 매우 널리 사용되는 라이브러리였는데, 실제 문제가 되었던 이유는 많은 libz 를 사용하는 프로그램들이 "정적라이브러리" 형식으로 라이브러리를 사용했기 때문에, 버그픽스(bug fix)를 위해서는 문제가 되는 libz 를 사용하는 프로그램들을 다시 컴파일 시켜야 했기 때문이다. 한마디로 버그픽스 자체가 어려웠던게 큰 문제였었다. 도대체 이 프로그램들이 libz 를 사용하고 있는지 그렇지 않은지를 완전하게 알기도 힘들뿐더러, 언제 그많은 프로그램을 다시 컴파일 한단 말인가.

    만약 libz 를 정적으로 사용하지 않고 "공유라이브러리" 형태로 사용한다면 bug fix 가 훨씬 쉬웠을것이다. 왜냐면 libz 공유라이브러리는 하나만 있을 것이므로 이것만 업그레이드 시켜주면 되기 때문이다.

    아뭏든 이렇게 유연성이 지나치게 떨어진다는 측면이 정적라이브러리를 사용하지 않는 가장 큰 이유가 될것이다. 프로그램들의 덩치가 커지는 문제는 유연성 문제에 비하면 그리큰문제가 되지는 않을것이다.

    3절. 라이브러리 만들고 사용하기

    이번장에서는 실제로 라이브러리를 만들고 사용하는 방법에 대해서 각 라이브러리 종류별로 알아볼 것이다.

    3.1절. 라이브러리화 할 코드

    라이브러리의 이름은 libmysum 이 될것이며, 여기에는 2개의 함수가 들어갈 것이다. 하나는 덧셈을 할 함수로 "ysum" 또 하나는 뺄셈을 위한 함수로 "ydiff" 으로 할것이다. 이 라이브러리를 만들기 위해서 mysum.h 와 mysum.c 2개의 파일이 만들어질것이다.

    mysum.h

    int ysum(int a, int b); 
    int ydiff(int a, int b);
    			

    mysun.c

    #include "mysum.h"
    int ysum(int a, int b)
    {
        return a + b; 
    }
    int ydiff(int a, int b)
    {
        return a - b;
    }
    			

    3.2절. 정적라이브러리 제작

    정적라이브러리는 위에서 말했듯이 단순히 오브젝트(.o)들의 모임이다. 오브젝트를 만든다음에 ar 이라는 명령을 이용해서 라이브러리 아카이브를 만들면 된다.

    [root@localhost test]# gcc -c mysum.c
    [root@localhost test]# ar rc libmysum.a mysum.o
    			
    아 주아주 간단하다. 단지 ar 에 몇가지 옵션만을 이용해서 libmysum 이란 라이 브러리를 만들었다. 'r' 은 libmysum.a 라는 라이브러리 아카이브에 새로운 오브젝트를 추가할것이라는 옵션이다. 'c' 는 아카이브가 존재하지 않을경우 생성하라는 옵션이다.

    이제 라이브러리가 실제로 사용가능한지 테스트해보도록 하자.

    예제 : print_sum.c

    #include "mysum.h"
    #include <stdio.h>
    #include <string.h>
    
    int main()
    {
        char oper[5];
        char left[11];
        char right[11];
        int  result;
    
        memset(left, 0x00, 11);
        memset(right, 0x00, 11);
    
        // 표준입력(키보드)으로 부터  문자를 입력받는다.
        // 100+20, 100-20 과 같이 연산자와 피연산자 사이에 공백을 두지 않아야 한다.  
        fscanf(stdin, "%[0-9]%[^0-9]%[0-9]", left, oper, right);
        if (oper[0] == '-')
        {
            printf("%s %s %s = %d\n", left, oper, right, 
                            ydiff(atoi(left), atoi(right)));
        }
        if (oper[0] == '+')
        {
            printf("%s %s %s = %d\n", left, oper, right, 
                            ysum(atoi(left), atoi(right)));
        }
    }
    			

    위의 프로그램을 컴파일 하기 위해서는 라이브러리의 위치와 어떤 라이브러리를 사용할것인지를 알려줘야 한다. 라이브러리의 위치는 '-L' 옵션을 이용해서 알려줄수 있으며, '-l' 옵션을 이용해서 어떤 라이브러리를 사용할것인지를 알려줄수 있다. -l 뒤에 사용될 라이브러리 이름은 라이브러리의 이름에서 "lib"와 확장자 "a"를 제외한 나머지 이름이다. 즉 libmysum.a 를 사용할 것이라면 "-lmysum" 이 될것이다.

    [root@localhost test]# gcc -o print_sum print_num.c -L./ -lmysum
    			
    만약 우리가 사용할 라이브러리가 표준 라이브러리 디렉토리경로에 있다면 -L 을 사용하지 않아도 된다. 표준라이브러리 디렉토리 경로는 /etc/ld.so.conf 에 명시되어 있다.

    정적라이브러리 상태로 컴파일한 프로그램의 경우 컴파일시에 라이브러리가 포함되므로 라이브러리를 함께 배포할 필요는 없다.

    3.3절. 공유라이브러리 제작 / 사용

    print_sum.c 가 컴파일되기 위해서 사용할 라이브러리 형태가 정적라이브러리에서 공유라이브러리로 바뀌였다고 해서 print_sum.c 의 코드가 변경되는건 아니다. 컴파일 방법역시 동일하며 단지 라이브러리 제작방법에 있어서만 차이가 날뿐이다.

    이제 위의 mysum.c 를 공유라이브러리 형태로 만들어보자. 공유라이브러리는 보통 .so 의 확장자를 가진다.

    [root@localhost test]# gcc -fPIC -c mysum.c
    [root@localhost test]# gcc -shared -W1,-soname,libmysutff.so.1 -o libmysum.so.1.0.1 mysum.o
    [root@localhost test]# cp libmysum.so.1.0.1 /usr/local/lib
    [root@localhost test]# ln -s /usr/local/lib/libmysum.so.1.0.1 /usr/local/lib/libmysum.so
    			
    우 선 mysum.c 를 -fPIC 옵션을 주어서 오브젝트 파일을 만들고, 다시 gcc 를 이용해서 공유라이브러리를 제작한다. 만들어진 라이브러리를 적당한 위치로 옮기고 나서 ln 을 이용해서 컴파일러에서 인식할수 있는 이름으로 심볼릭 링크를 걸어준다.

    컴파일 방법은 정적라이브러리를 이용한 코드의 컴파일 방법과 동일하다.

    [root@coco test]# gcc -o print_sum print_sum.c -L/usr/local/lib -lmysum
    			

    공유라이브러리는 실행시에 라이브러리를 적재함으로 프로그램을 배포할때는 공유라이브러리도 함께 배포되어야 한다. 그렇지 않을경우 다음과 같이 공유라이브러리를 찾을수 없다는 메시지를 출력하면서 프로그램 실행이 중단될 것이다.

    [root@coco library]# ./print_sum
    ./print_sum: error while loading shared libraries: libmysub.so: cannot open shared object file: No such file or directory
    			
    위 와 같은 오류메시지를 발견했다면 libmysub.so 가 시스템에 존재하는지 확인해 보자. 만약 존재하는데도 위와 같은 오류가 발생한다면 이는 LD_LIBRARY_PATH 나 /etc/ld.so.conf 에 라이브러리 패스가 지정되어 있지 않을 경우이다. 이럴때는 LD_LIBRARY_PATH 환경변수에 libmysub.so 가 있는 디렉토리를 명시해주거나, /etc/ld.so.conf 에 디렉토리를 추가시켜주면 된다.

    만약 libmysub.so 가 /usr/my/lib 에 복사되어 있고 환경변수를 통해서 라이브러리의 위치를 알려주고자 할때는 아래와 같이 하면된다.

    [root@localhost test]# export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/my/lib 
    			
    그렇지 않고 ld.so.conf 파일을 변경하길 원한다면(이럴경우 관리자 권한을 가지고 있어야 할것이다) ld.so.conf 에 라이브러리 디렉토리를 추가하고 ldconfig 를 한번 실행시켜주면 된다.
    [root@localhost test]# cat /usr/my/lib >> /etc/ld.so.conf 
    [root@localhost test]# ldconfig
    			
    ldconfig 를 실행시키게 되면 /etc/ld.so.conf 의 파일을 참조하여서 /etc/ld.so.cache 파일이 만들어지고, 프로그램은 ld.so.cache 의 디렉토리 경로에서 해당 라이브러리가 있는지 찾게 된다.

    3.4절. 동적라이브러리의 사용

    동적라이브러리라고 해서 동적라이브러리를 만들기 위한 어떤 특별한 방법이 있는것은 아니다. 일반 공유라이브러리를 그대로 쓰며, 단지 실행시간에 동적라이브러리를 호출하기 위한 방법상의 차이만 존재할 뿐이다.

    정적/공유 라이브러리가 라이브러리의 생성방법과 컴파일방법에 약간의 차이만 있고 코드는 동일하게 사용되었던것과는 달리 동적라이브러리는 코드자체에 차이가 있다. 그럴수밖에 없는게, 동적라이브러리는 프로그램이 샐행되는 중에 특정한 시점에서 부르고 싶을때 라이브러리를 적재해야 하므로, 라이브러리를 적재하고, 사용하고 해제(free) 하기 위한 코드를 생성해야 하기 때문이다.

    linux 에서는 이러한 라이브러리를 호출하기 위한 아래와 같은 함수들을 제공한다. 아래의 함수들은 solaris 에서 동일하게 사용될수 있다.

    #include <dlfcn.h>
    
    void *dlopen (const char *filename, int flag);
    const char *dlerror(void);
    void *dlsym(void *handle, char *symbol);
    int dlclose(void *handle); 
    			
    dlopen 은 동적라이브러리를 적재하기 위해서 사용된다. 첫번째 아규먼트인 filename 은 /usr/my/lib/libmysum.so 와 같이 적재하기 원하는 라이브러리의 이름이다. 만약 적재시킬 라이브러리의 이름이 절대경로로 지정되어 있지 않을경우에는 LD_LIBRARY_PATH 에 등록된 디렉토리에서 찾고, 여기에서도 찾지 못할경우 /etc/ld.so.cache 에 등록된 디렉토리 리스트에서 찾게 된다. dlopen 이 성공적으로 호출되면 해당 라이브러리에 대한 handle 값을 넘겨 준다. flag 는 RTLD_LAZY와 RTLD_NOW 중 하나를 정의할수 있다. RTLD_LAZY는 라이브러리의 코드가 실행시간에 정의되지 않은 심볼을 해결하며, RTLD_NOW 는 dlopen 의 실행이 끝나기전에(return 전에) 라이브러리에 정의되지 않은 심볼을 해결한다.

    dlerror 는 dl 관련함수들이 제대로 작동을 수행하지 않았을경우 에러메시지를 되돌려준다. dleooro(), dlsym(), dlclose(), dlopen()중 마지막 호출된 함수의 에러메시지를 되돌려준다.

    dlsym 은 dlopen 을 통해서 열린라이브러리를 사용할수 있도록 심볼값을 찾아준다. 심볼이라고 하면 좀 애매한데, 심볼값은 즉 열린라이브러리에서 여러분이 실제로 호출할 함수의이름이라고 생각하면 된다. handle 는 dlopen 에 의해서 반환된 값이다. symbol 은 열린라이브러리에서 여러분이 실제로 부르게될 함수의 이름이다. dlsym 의 리턴값은 dlopen 으로 열린 라이브러리의 호출함수를 가르키게 된다. 리턴값을 보면 void * 형으로 되어 있는데, void 형을 사용하지 말고 호출함수가 리턴하는 형을 직접명시하도록 하자. 이렇게 함으로써 나중에 프로그램을 유지보수가 좀더 수월해진다.

    3.5절. 동적라이브러리를 사용하여 프로그램의 확장성과 유연성을 높이기

    동적라이브러리는 실행시간에 필요한 라이브러리를 호출할수 있음으로 조금만(사실은 아주 많이겠지만 T.T) 신경쓴다면 매우 확장성높고 유연한 프로그램을 만들수 있다.

    동적라이브러리의 가장 대표적인 예가 아마도 Plug-in 이 아닐까 싶다. 만약에 모질라 브라우저가 plug-in 을 지원하지 않는 다면 우리는 새로운 기능들 이 추가될때 마다 브라우저를 다시 코딩하고 컴파일하는 수고를 해야할것이다. 그러나 동적라이브러리를 사용하면 브라우저를 다시 코딩하고 컴파일 할필요 없이, 해당 기능을 지원하는 라이브러리 파일만 받아서 특정 디렉토리에 설치하기만 하면 될것이다. 물론 동적라이브러리를 사용하기만 한다고 해서 이러한 기능이 바로 구현되는 건 아니다. Plug-in 의 효율적인 구성을 위한 표준화된 API를 제공하고 여기에 맞게 Plug-in 용 라이브러리를 제작해야만 할것이다.

    우리가 지금까지 얘로든 프로그램을 보면 현재 '+', '-' 연산을 지원하고 있는데, 만약 'x', '/' 연산을 지원하는 라이브러리가 만들어졌다면, 우리는 프로그램의 코딩을 다시해야만 할것이다. 이번에는 동적라이브러리를 이용해서 plug-in 방식의 확장이 가능하도록 프로그램을 다시 만들어 보도록 할것이다.

    3.5.1절. 동적라이브러리를 이용한 예제

    동적라이브러리를 이용해서 main 프로그램의 재코딩 없이 추가되는 새로운 기능을 추가시키기 위해서는 통일된 인터페이스를 지니는 특정한 형식을 가지도록 라이브러리가 작성되어야 하며, 설정파일을 통하여서 어떤 라이브러리가 불리어져야 하는지에 대한 정보를 읽어들일수 있어야 한다. 그래서 어떤 기능을 추가시키고자 한다면 특정 형식에 맞도록 라이브러리를 제작하고, 설정파일을 변경하는 정도로 만들어진 새로운 라이브러리의 기능을 이용할수 있어야 한다.

    설정파일은 다음과 같은 형식으로 만들어진다. 설정파일의 이름은 plugin.cfg 라고 정했다.

    +,ysum,libmysum.so
    -,ydiff,libmysum.so
    				
    '-' 연산에대해서는 libmysum.so 라이브러리를 호출하며, ydiff 함수를 사용한다. '=' 연산에 대해서는 libmysum.so 라이브러리를 호출하고 ysum 함수를 사용한다는 뜻이다. 설정파일의 이름은 plugin.cfg 로 하기로 하겠다.

    다음은 동적라이브러리로 만들어진 print_sum 의 새로운 버젼이다.

    예제 : print_sum_dl.c

    #include <stdlib.h>
    #include <stdio.h>
    #include <dlfcn.h>
    #include <string.h>
    
    struct input_data
    {
        char    oper[2];
        char    func[10]; 
        char    lib[30];
    };
    
    int main(int argc, char **argv)
    {
        char oper[2];
        char left[11];
        char right[11];
        char buf[50];
        char null[1];
        int data_num;
    
        struct input_data plug_num[10]; 
    
        void *handle;
    
        int (*result)(int, int);
        int i;
        char *error;
    
        FILE *fp;
    
        // 설정파일을 읽어들이고 
        // 내용을 구조체에 저장한다. 
        fp = fopen("plugin.cfg", "r");
        data_num = 0;
        while(fgets(buf, 50, fp) != NULL)
        {
            buf[strlen(buf) -1] = '\0';
            sscanf(buf, "%[^,]%[,]%[^,]%[,]%[^,]", plug_num[data_num].oper, 
                                                   null,    
                                                   plug_num[data_num].func, 
                                                   null,
                                                   plug_num[data_num].lib);
            data_num ++;
        }
        fclose(fp);
    
        printf("> ");
        memset(left, 0x00, 11);
        memset(right, 0x00, 11);
        fscanf(stdin, "%[0-9]%[^0-9]%[0-9]", left, oper, right);
    
        // 연산자를 비교해서 
        // 적당한 라이브러리를 불러온다. 
        for (i  = 0; i < data_num ; i++)
        {
            int state; 
            if ((state = strcmp(plug_num[i].oper, oper)) == 0) 
            {
                printf("my operator is      : %s\n", plug_num[i].oper);
                printf("my call function is : %s\n", plug_num[i].func);
                break;
            }
        }    
    
        if (i == data_num)
        {
            printf("--> unknown operator\n");
            exit(0);
        }
    
        handle = dlopen(plug_num[i].lib, RTLD_NOW);
        if (!handle)
        {
            printf("open error\n");
            fputs(dlerror(), stderr);
            exit(1);
        }
    
        // 연산자에 적당한 함수를 불러온다. 
        result = dlsym(handle, plug_num[i].func);
        if ((error = dlerror()) != NULL)
        {
            fputs(error, stderr);
            exit(1);
        }
    
        printf("%s %s %s = %d\n",left, oper, right, result(atoi(left), atoi(right)) ); 
    
        dlclose(handle);
    }
    				
    위의 예제 프로그램은 다음과 같이 컴파일되어야 한다. 라이브러리 파일의 위치는 /usr/my/lib 아래에 있는것으로 하며, 라이브러리 찾기 경로에 등록되어 있다고 가정하겠다.
    [root@localhost test]# gcc -o print_sum_dl print_sum_dl.c -ldl 
    				
    이 프로그램을 실행하면 사용자의 입력을 기다리는 "> "가 뜨게 되고, 여기에 계산하기 원하는 값을 입력하면 된다. 현재는 '+'와 '-' 연산만을 지원하며, 연산자와 피연산자들 간에 간격이 없어야 한다. 다음은 실행결과 화면이다.
      
    [root@localhost test]# ./print_sum_dl
    > 99+99
    my operator is      : +
    my call function is : ysum
    99 + 99 = 198
    [root@localhost test]#
    				
    사 용자가 프로그램을 실행하면 프로그램은 사용자의 입력을 받아들이고 sscanf 를 이용해서 연산자와 피연산자를 구분하게 된다. 그리고 피연산자를 값으로 하여, 설정파일에 설정된 라이브러리를 불러들이고(dlopen) 해당 함수를 가져와서(dlsym) 실행시키게 된다.

    자 이렇게 해서 우리는 '+', '-' 연산이 가능한 프로그램을 하나 만들게 되었다. 그런데 A 라는 개발자가 '*','/' 연산도 있으면 좋겠다고 생각해서 아래와 같은 코드를 가지는 '*', '/' 연산을 위한 라이브러리를 제작하였다.

    예제 : mymulti.h

    int multi(int a, int b);
    int div(int a, int b);
    				
    예제 : mymulti.c
    int multi(int a, int b)
    {
        return a * b;
    }
    
    int div(int a, int b)
    {
        return a / b;
    }
    				

    A 라는 개발자는 이것을 다음과 같이 공유라이브러리 형태로 만들어서 간단한 라이브러리의 설명과 함께 email 로 전송했다.

    [root@localhost test]# gcc -c -fPIC mymulti.c
    [root@localhost test]# gcc -shared -W1,-soname,libmymulti.so.1 -o libmymulti.so.1.0.1 mymulti.o
    				

    라이브러리를 받았으므로 새로운 라이브러리가 제대로 작동을 하는지 확인을 해보도록 하자. 우선 libmymulti.so.1.0.1 을 /usr/my/lib 로 복사하도록 하자. 그다음 설정파일에 다음과 같은 내용을 가지도록 변경 시키도록 하자.

     
    +,ysum,libmystuff.so
    -,ydiff,libmystuff.so
    *,ymulti,libmymulti.so.1.0.1
    /,ydiv,libmymulti.so.1.0.1
    				
    이제 print_sum_dl 을 실행시켜보자.
    [root@localhost test]# ./print_sum_dl
    > 10*10
    my operator is      : *
    my call function is : ymulti
    10 * 10 = 100
    
    [root@localhost test]# ./print_sum_dl
    > 10/10
    my operator is      : /
    my call function is : ydiv
    10 / 10 = 1
    				
    print_sum_dl.c 의 원본파일의 아무런 수정없이 단지 설정파일만 변경시켜 줌으로써 기존의 print_sum_dl 에 "곱하기"와 "나누기"의 새로운 기능이 추가 되었다.

    위에서도 말했듯이 이러한 Plug-in 비슷한 기능을 구현하기 위해서는 통일된 함수 API가 제공될수 있어야 한다.

    4절. 결론

    여기에 있는 내용중 동적라이브러리에 대한 내용은 솔라리스와 리눅스에서만 동일하게 사용할수 있다. Hp-Ux 혹은 윈도우에서는 사용가능하지 않는 방법이다. 이에 대한 몇가지 해법이 존재하는데, 이 내용은 나중에 시간이 되면 다루도록 하겠다. 어쨋든 솔라리스와 리눅스 상에서 코딩되고 윈도우 혹은 다른 유닉스로 포팅될 프로그램이 아니라면 위의 방법을 사용하는데 있어서 문제가 없을것이다.

    'OS > LINUX' 카테고리의 다른 글

    /lib/libc.so.6: version `GLIBC_2.7' not found  (0) 2014.03.18
    timer  (0) 2012.01.06
    makefile 오류 메시지  (0) 2011.07.12
    컴파일 의존성 체크  (0) 2011.07.12
    각종 사용량 체크  (0) 2011.07.05
    반응형
    출처 : http://www.dreampharos.com/
    퍼온곳: http://psjin14.egloos.com/2989814

    [gcc 컴파일]

    1) gcc 파일명(*.c) : Default로 out 파일이 생성된다. (ex a.out)
    2) gcc -c 파일명(*.c) : 오브젝트 파일을 생성한다.
    3) gcc -c 오브젝트_파일명(*.o) 파일명(*.c)
        gcc -o 실행파일명(*.out) 오브젝트_파일명(*.o)
     

    4) gcc -o 실행파일 파일명(*.c) : 실행 파일을 만든다. (3번을 한줄로...)

        (소스 파일 컴파일 → 오브젝트 파일 생성 → 실행파일 생성 → 오브젝트 파일 삭제) 

     

    ===================================================================================================

     [gcc 옵션]

    1. -Wall 옵션 : 모든 모호한 코딩에 대해서 경고를 보내는 옵션
    2. -W 옵션 : 합법적이지만 모호한 코딩에 대해서 경고를 보내는 옵션
    3. -W -Wall 옵션 : 아주 사소한 모호성에 대해서도 경고가 발생
    4. O2 옵션 : 최적화 레벨 2로 설정. (대부분의 최적화를 시도)
    5. -E 옵션 : 전처리 과정의 결과를 화면에 보이는 옵션 (전처리과정 중 발생한 오류를 검증)
                     ※ enhanced Tip: --save-temps 옵션 
     

    6. -S 옵션 : cc1으로 전처리된 파일을 어셈블리 파일로 컴파일까지만 수행하고 멈춘다. (*.s)

    7. -c 옵션 : as에 의한 어셈블까지만 수행하고 링크는 수행하지 않는다.
    8. -v 옵션 : gcc가 컴파일을 어떤 식으로 수행하는지를 화면에 출력한다.
    9. --save-temps 옵션 : 컴파일 과정에서 생성되는 중간 파일인 전처리 파일(*.i)과 어셈블리 파일(*.s)을 
                                     지우지 않고, 현재 디렉토리에 저장한다. (오류 분석에 사용)

     ===================================================================================================

     [cpp0 옵션]
    : 소스내에서 사용된 헤더 파일과 define 매크로와 관련된 옵션들이다.
      전처리 과정에서 오류가 발생한다면 cpp0 옵션들을 점검해야 한다.

     1) -l 옵션 : 전처리 과정에서 헤더 파일을 탐색하는 기본 디렉토리를 추가할 때 사용하는 옵션
    2) -include 옵션 : 헤더 파일을 소스내에 추가할 때 사용한다.
    3) -D[매크로] 옵션 : 매크로를 외부에서 define 할 때 사용한다.
    4) -D[매크로]=[매크로 값] 옵션 : 소스 내에 #define [매크로] [매크로 값] 옵션을 추가한 것과 동일하다.

    5) -U[매크로] 옵션 : -D와 반대로 소스 파일 내에 #undef[매크로] 옵션을 추가한 것과 동일하다.

    6) -M / -MM 옵션 : -M 옵션 - make를 위한 소스 파일의 모든 종속 항목을 출력
                                -MM 옵션 - 기본 include 디렉토리에 있는 헤더 파일은 빼고 종속 항목을 출력한다.

     7) -nostdinc 옵션 : 디폴트 include 디렉토리(usr/include)에서 헤더 파일을 탐색하지 않고,
                               -l 옵션으로 추가한 디렉토리에서만 헤더 파일을 찾는다.

     8) -C 옵션 : -E 옵션과 함께 사용하며, 전처리 과정에서 주석을 제거하지 않는다.
    9) -Wp,[옵션들] 옵션 : 만약 cpp0와 gcc의 옵션이 같은 것으로 중복되면 gcc 옵션으로 해석되므로...

                                    gcc의 해석을 거치지 않고 바로 cpp0 옵션으로 전달하고 싶을 때 사용한다.        

     ===================================================================================================

     [cc1 옵션]
    : "C언어 옵션, 경고 옵션, 최적화 옵션, 디버깅 옵션"의 4가지 종류
      "경고 수위 조절 or 최적화 수위 조절"을 하고 싶을 때 사용한다.

     1. C언어 옵션 : C언어 종류와 표준에 관련된 옵션
       1) -ansi 옵션 : ANSI C 표준에 부합하는 소스를 작성하고자 할 때 사용하는 옵션 
       2) -std=[C 표준들] 옵션 : 기타 다른 표준들을 지정하고자 할 때 사용한다.
       3) -traditional 옵션 : 오래된 Traditional C 문법으로 문법을 검사한다.
       4) -fno -asm 옵션 : gnu89 문법을 바탕으로 asm, inline, typeof 키워드를 사용하지 않기를 원할 때 
                                   사용한다.
        

    2. 경고 옵션 : cc1의 옵션을 조정하여 경고 수위를 조절할 수 있다.
       1) -W / -Wall 옵션 (gcc 옵션 참고)
       2) -w(소문자) 옵션 : 모든 경고 메시지를 제거한다.
       3) -Werror 옵션 : 모든 경고를 컴파일을 중단하는 오류로 취급한다. 

                               (경고가 하나만 나와도 컴파일이 중단된다.)

       4) -pedantic 옵션 : ANSI C89 표준에서 요구하는 모든 경고 메시지를 표시한다.
       5) -pedantic-errors 옵션 : ANSI C89 표준에서 요구하는 모든 오류 메시지를 표시한다.
       6) -Wtraditional 옵션 : 소스가 ANSI C와 K&R C 간에 서로 다른 결과를 가져올 수 있는 부분이 있다면 
                                      경고한다. 

    3. 최적화 옵션 : ⓐ 실행 파일의 크기를 줄여 메모리와 하드디스크의 사이즈를 절약 (큰 의미 X)
                             ⓑ 실행 파일의 크기를 줄여 실행 속도를 향상시키는 것.

        1) -O0 옵션 : 최적화를 수행하지 않는다.
       2) -O1 옵션 : -O0보다는 조금 낫다. 
       3) -O2 옵션 : 가장 많이 사용하는 옵션. 일반 응용 프로그램이나 커널을 컴파일 할 때 사용
                          (거의 대부분의 최적화를 수행한다.)

       4) -O3 옵션 : 가장 높은 레벨의 최적화. 모든 함수를 인라인 함수와 같이 취급한다.               
                          (Call 인스트럭션은 사용 X. but, 되도록이면 사용하지 않는 것이 좋다. 
                              → 너무나 많은 소스의 변경이 가해지기 때문에 왜곡이 발생할 위험이 있다.)

       5) -O5 옵션 : 사이즈 최적화를 실행한다. (공간이 협소한 곳에서 사용 - 임베디드 시스템)

     

     4. 디버깅 옵션
       1) -g 옵션 : gdb에게 제공하는 정보를 바이너리에 삽입한다.
                    (-g 옵션을 사용하지 않고 gdb로 디버깅하면, 역어셈 → 어셈블리 코드로만 디버깅 가능)

       2) -pg 옵션 : 프로파일을 위한 코드를 삽입한다. 
                     (-pg 옵션으로 컴파일 → gmon.out(프로파일 정보) → gprof로 gmon.out 파일 분석)

    ===================================================================================================

    [as의 옵션]
    : gcc는 as의 옵션에 대해서는 알지 못한다. -Wa,[as 옵션들] 형식으로 gcc를 거치지 않고 
      바로 전달해야 한다. -Wa, -al, -as와 같은 형식으로 사용하면 as에게 -al -as 옵션이 같이 전해진다.

     -Wa,[as 옵션들]
    1) -al 옵션 : 어셈블된 인스트럭션을 보인다.
    2) -as 옵션 : 정의된 심볼을 보인다.
    3) -l[패스] 옵션 : include 디렉토리를 지정한다. 어셈블리 소스 내에서 사용된 include 지정자가 
                       지정하는 헤더파일을 찾고자 할 때 사용한다.
    4) -W / --no-warn : 경고 메시지를 출력하지 않는다.
    5) -march=[아키텍처 문자열] : 해당 어셈블리

     ===================================================================================================

     [collect2 / ld 옵션]
    : 링크 옵션

     1) -L[라이브러리 디렉토리] 옵션 : 라이브러리를 찾을 디렉토리를 지정한다.
    2) -l 옵션 : 같이 링크할 라이브러리를 지정한다.
    3) -shared 옵션 : 공유 라이브러리와 정적 라이브러리가 같이 있을 경우, 공유 라이브러리를 우선하여
                             링크한다. (아무 옵션을 주지 않아도 공유 라이브러리를 우선으로 링크한다.)

     4) -static 옵션 : 정적 라이브러리와 공유 라이브러리가 같이 있다면, 정적 라이브러리를 우선하여
                           링크한다. (속도는 빠르지만 파일 사이즈가 커진다는 점 고려할 것!)

     5) -nostdlib 옵션 : 링크시에 표준 C 라이브러리를 사용하지 않는다. 
                              (OS, 부트로더와 같은 프로그램을 컴파일 할 때 사용)

     6) -nostartfiles 옵션 : crt1.o 등과 같은 start up 파일을 링크하지 않는다.
                              (OS, 부트로더와 같은 프로그램을 컴파일 할 때 사용)

     7) -Wl,[링크 옵션들] 옵션 : gcc를 거치지 않고 바로 링크에게 옵션을 정해주고자 할 때 사용한다.
                                          (사용법은 -Wa와 동일한다.)
       
       < 유용한 링크 옵션들 >
       ① -s 옵션 : 실행 파일에서 심볼 테이블을 제거
       ② -x 옵션 : 출력 파일에서 로컬 심볼 제거
       ③ -n 옵션 : 텍스트 영역을 읽기 전용으로 만듬
       ④ -r 옵션 : 추후 링크가 가능하게 오브젝트를 만듬
       ⑤ -e [name] 옵션 :  시작 심볼을 name 심볼로 사용 (default 시작심볼 : _start 심볼)
       ⑥ -M 옵션 : 심볼들의 정보를 자세하게 출력
       ⑦ oformat [format] 옵션 : 주어진 형식의 오브젝트 파일을 생성

    =============================================================================================================

    'language > C' 카테고리의 다른 글

    2차원 배열 크기 구하기  (0) 2013.01.15
    printf format string  (0) 2012.01.18
    callback 함수  (0) 2011.10.06
    데이터 타입  (0) 2011.07.14
    컴파일 오류 메세지  (0) 2011.07.07
    반응형

    http://kldp.org/node/105616

    다른 곳에서 나를 호출할 수 있도록 해 주는 것??

    'language > C' 카테고리의 다른 글

    printf format string  (0) 2012.01.18
    gcc option  (0) 2011.10.26
    데이터 타입  (0) 2011.07.14
    컴파일 오류 메세지  (0) 2011.07.07
    bool  (0) 2011.07.07

    + Recent posts