블로그 이미지
하루, 글. 그림. 영상매체. 표현을 도와주는 기기들. 도전 중. 동화다아아
    동화다아아

    카테고리

    분류 전체보기 (176)
    잡담 (1)
    IT 기기-리뷰&뉴스 (7)
    리뷰 - 도서 (1)
    리뷰 - 영상 (0)
    리뷰 - 그림/음악 (1)
    내장형 하드웨어 (163)
    Total
    Today
    Yesterday
     

    - linux 기본 명령어 복습


    ls → 디렉토리와 파일목록을 보여준다.

    ls -l → 디렉토리(폴더)와 파일을 분리해서 나타내 준다.

    ls -a → 숨겨진 파일을 보여준다. 숨겨진 파일은 파일명 가장 앞부분에 “.”이 들어가 있다.

            또한, 보통 파일명 앞에 .을 붙이면 그 파일은 숨겨진 파일로 변하게 된다.

    ls -al → a와 l의 특징을 모두 표현한다.


    pwd → 현재 경로를 출력해 준다.

    cd .. → 한단계 위로 올라간다.

    cd / → 최상위 디렉토리로 이동.

    cd /home/trainer2 → 루트에서 /home/trainer2로 한번에 이동.

    mkdir → 디렉토리 생성.

    rmdir → 디렉토리 삭제.

    cp 파일1 파일2 → 파일1이 파일2라는 이름으로 복사.

    rm(ReMove) → 파일 삭제

    mv(MoVe) 복사원본 복사사본 → 파일 이동(cp와는 달리, 파일이 복사된 후 원본 파일은 삭제. 따라서 파일 이름을 변경할 때 많이 쓰인다.)


    컴파일 5단계 복습.

    - 전처리(processer) → 2. 전처리 파일("xx.i") → 3. 컴파일러(compiler) → 4. 어셈블리어파일(“xx.s") → 5. 어셈블러(assembleer) → 6. 오브젝트(”xx.o") → 7. 링커(Linker) → 8. 실행파일(*.exe)


    ⇒ 전처리 단계

    - #include, #define등의 전처리 처리

    - #include 헤드파일지정시 < > : 기본디렉토리 “ ” : 현재디렉토리에서 head파일을 참조한다.

    - 그 결과로 "xx . i" 파일 생성

    - "xx . i" 파일엔 키워드를 쓰게끔 전역함수가 설정 되어있다. ex)printf, scanf 등

     

    ⇒ 컴파일 단계

    - 어셈블리어 파일 생성하는 단계 임시파일임

    - 컴퓨터가 읽을수 있게 숫자등으로 치환 // 치환화일을 "xx . s"저장

     

    ⇒ 어셈블리어 단계

    - 기계어코드( "xx . s" )을 읽어서 목적코드( "xx . o" )를 생성하는 단계

     

    ⇒ 링크 단계

    - 여러개의 파일로 나누어져 있거나, 라이브러리 함수 등이 존재 할 때 서로 연결 시켜서 실행 가능한 프로그램으로 생성하는 단계


    ⇒ 실행파일 생성

    - 링크단계가 끝나면 실행파일이 생성된다.


    ⇒ gcc -c (이름).c → 오브젝트 파일 생성(linux)

    ⇒ cl (이름).obj → 오브젝트 파일 생성(win)


    gcc -c main.c → 컴파일 다섯단계 중 오브젝트 파일(.o)까지 이상이 없을 경우에 에러없이 실행된다. 즉, 여기까지 이상없이 진행이 된다면 문법적인 오류는 없다는 뜻.



    - main 함수와 Hello 함수를 분리시켜서 분할 컴파일 하는 과정

    // main.c

    #include<stdio.h>

    void Hello();

    int main()

    {

            printf("-----시작-----\n");

            Hello();

            printf("-----끝-----\n");

            return 0;

    }

    // hello.c

    #include<stdio.h>

    void Hello()

    {

            printf("Hello everyone!!!\n");

            printf("C programming is interesting\n");

            printf("but, C programming is difficult\n");


            return ;

    }

    각각의 파일을 컴파일 해보면 다음과 같은 에러가 발생한다.

     

    각각 main.c를 컴파일 했을 때.

    linux에서 

    undifined reference to 'Hello' collect2; ~

                    → 'Hello' 파일이 참조 정의되어 있지 않다.

                    collect 2는 링크 단계에서 오류가 발생했다는 뜻이다.

                    → 즉, 실행시킨 main.c 파일에서 Hello 함수를 찾을 수 없다는 뜻.

                    → 하지만 링크 단계 전에 오류가 없다는 것으로 문법적이 오류는 찾을 수 없다는 것을 확인할 수 있다.

    win 에서

    main.obj : error LNK2001: unresolved external symbol _Hello

    main.exe : fatal error LNK1120: 1 unresolved externals

                    → linux의 reference 처럼 external symbol 이 출력되며 에러가 표시된 것을 볼 수 있다. 역시 마찬가지로 _Hello 파일이 정의되지 않았다는 뜻이다.

                    → _Hello에서 '_'는 어셈블리어로 변환되면서 함수앞에 자동으로 언더바가 붙게 된 것이다.

                    → symbol이라는 표현이 있는데 함스도 심벌테이블에 등록된다는 뜻이다. 즉 함수도 type 가진다는 뜻.

    ⇒ hello.c의 컴파일도 동일하다.

    ※ C는 프로그램 시작할 때 제일 처음 시작하는 함수 이름이 main이다. 즉, main 함수는 반드시 있어야 하는데 C에서는 main, win에서는 winmain 등 이름은 다를 수 있다. 이와 같은 것을 entry point(진입점)이라고 한다.

    ⇒ 나누어진 두 파일을 컴파일을 통해 합친다.

     → main.c 와 hello.c 파일을 gcc -c 명령을 통해 main.o 와 hello.o 파일을 생성하여 분할 컴파일을 실시한다.

     → gcc - c *.c (→ win 에서는 cl 파일이름.obj)

     →

     → gcc - o 실행파일 이름 main.o hello.o 라고 하면 두 파일이 합쳐져 컴파일 된다.         


    ※ 컴파일러는 표준함수(ex. printf ...)는 자동으로 .o 파일을 생성해 준다.(.lib 은 각종 .o 파일을 모아둔다.)


    Posted by 동화다아아
    , |

    최근에 달린 댓글

    최근에 받은 트랙백

    글 보관함