πŸ“˜15μž₯ Writing Large Programs | Study

파인·2022λ…„ 1μ›” 27일
0

C

λͺ©λ‘ 보기
5/9
post-thumbnail
post-custom-banner

C Programming, A Modern Approach - K.N.KING으둜 Cμ–Έμ–΄λ₯Ό κ³΅λΆ€ν•˜λ©΄μ„œ μ •λ¦¬ν•œ λ‚΄μš©μž…λ‹ˆλ‹€.
λ²ˆμ—­λ³Έ https://wikidocs.net/book/2494 을 μ°Έκ³ ν•˜μ˜€μŠ΅λ‹ˆλ‹€.



15.1 Source Files
15.2 Header Files
15.3 Dividing a Program into Files
15.4 Building a Multiple-File Program



πŸ“ Writing Large Programs

μ†ŒμŠ€ νŒŒμΌμ€ ν•¨μˆ˜μ™€ μ™ΈλΆ€ λ³€μˆ˜μ˜ μ •μ˜λΆ€λ₯Ό κ°–κ³  있고, 헀더 νŒŒμΌμ€ μ†ŒμŠ€ νŒŒμΌκ°„ κ³΅μœ ν•  정보λ₯Ό κ°–κ³  μžˆλ‹€.



πŸ“ Source Files

C ν”„λ‘œκ·Έλž¨μ€ μ—¬λŸ¬κ°œμ˜ μ†ŒμŠ€ 파일둜 λ‚˜λ‰  수 μžˆλ‹€. 각 μ†ŒμŠ€νŒŒμΌμ€ 주둜 ν•¨μˆ˜μ™€ λ³€μˆ˜λ“€μ˜ μ •μ˜κ°€ 담겨 있으며 μ†ŒμŠ€ νŒŒμΌλ“€ 쀑 ν•˜λ‚˜λŠ” λ°˜λ“œμ‹œ ν”„λ‘œκ·Έλž¨μ˜ μ‹œμž‘μ μ„ μ˜λ―Έν•˜λŠ” main ν•¨μˆ˜λ₯Ό 가지고 μžˆμ–΄μ•Ό ν•œλ‹€.

πŸ”Ž ν”„λ‘œκ·Έλž¨μ„ μ—¬λŸ¬ μ†ŒμŠ€ 파일둜 λ‚˜λˆŒ λ•Œμ˜ μž₯점

1) 관련이 μžˆλŠ” ν•¨μˆ˜, λ³€μˆ˜λ“€μ„ ν•œ 파일둜 λͺ¨μœΌλ©΄ ν”„λ‘œκ·Έλž¨μ˜ ꡬ쑰가 λͺ…확해진닀.

2) 각 μ†ŒμŠ€ νŒŒμΌλ“€μ€ λ”°λ‘œ 컴파일 μ‹œν‚¬ 수 μžˆμ–΄ ν”„λ‘œκ·Έλž¨μ˜ 규λͺ¨κ°€ ν¬κ±°λ‚˜ 자주 μˆ˜μ •λ˜λŠ” 경우 μ‹œκ°„μ΄ μ ˆμ•½λœλ‹€

3) ν•¨μˆ˜λ“€μ„ λ”°λ‘œ μ†ŒμŠ€ 파일둜 정리해주면 λ‹€λ₯Έ ν”„λ‘œκ·Έλž¨μ—μ„œλ„ μž¬μ‚¬μš©ν•  수 μžˆλ‹€. main ν•¨μˆ˜μ™€ λ‹€λ₯Έ ν•¨μˆ˜λ“€μ„ λΆ„λ¦¬ν•¨μœΌλ‘œμ¨ λ‹€λ₯Έ ν”„λ‘œκ·Έλž¨μ—μ„œ ν•΄λ‹Ή ν•¨μˆ˜ μ‚¬μš©μ΄ κ°€λŠ₯해진닀.



πŸ“ Header Files

#include μ§€μ‹œμžλ₯Ό 톡해 μ—¬λŸ¬ μ†ŒμŠ€ 파일 κ°„ ν•¨μˆ˜ μ›ν˜•, 맀크둜 μ •μ˜, ν˜• μ •μ˜ λ“±κ³Ό 같은 정보듀을 κ³΅μœ ν•  수 μžˆλ‹€.

#include μ§€μ‹œμžλŠ” μ „μ²˜λ¦¬κΈ°μ—κ²Œ 주어진 νŒŒμΌμ„ μ—΄μ–΄ κ·Έ λ‚΄μš©μ„ ν˜„μž¬ νŒŒμΌμ— μ „λΆ€ λΆ™μ—¬λ„£κΈ° λ§Œλ“ λ‹€. 이런 μ‹μœΌλ‘œ μΆ”κ°€λ˜λŠ” νŒŒμΌλ“€μ„ 헀더 파일(header file)이라고 λΆ€λ₯Έλ‹€.



πŸ“ The #include Directive

πŸ”Ž #include μ‚¬μš©

1) C 자체 λΌμ΄λΈŒλŸ¬λ¦¬μ— μ‘΄μž¬ν•˜λŠ” 헀더 νŒŒμΌμ„ μΆ”κ°€ν•  λ•Œ

#include <filename>

μ‹œμŠ€ν…œ 헀더 νŒŒμΌλ“€μ΄ μžˆλŠ” ν΄λ”μ—μ„œ νŒŒμΌμ„ μ°ΎλŠ”λ‹€.

2) 직접 μž‘μ„±ν•΄μ€€ 헀더 파일 λ“±

#include "filename"

이 경우 ν˜„μž¬ ν΄λ”μ—μ„œ νŒŒμΌμ„ μ°ΎλŠ”λ‹€.




πŸ“ Sharing Macro Definitions and Type Definitions

맀크둜 μ •μ˜, ν–‰ μ •μ˜λ“€μ„ μ†ŒμŠ€ νŒŒμΌλ“€ 간에 κ³΅μœ ν•΄μ•Ό ν•  λ•ŒλŠ” ν—€λ”νŒŒμΌμ— λ„£μ–΄μ£ΌλŠ” 것이 μ’‹λ‹€.

그러면 μ†ŒμŠ€ νŒŒμΌλ§ˆλ‹€ 일일이 μ •μ˜λ₯Ό 넣어쀄 ν•„μš”κ°€ μ—†μœΌλ©° ν”„λ‘œκ·Έλž¨μ„ μˆ˜μ •ν•˜κΈ°κ°€ μ‰¬μ›Œμ§„λ‹€. λ˜ν•œ μ†ŒμŠ€ νŒŒμΌλ“€μ΄ μ„œλ‘œ 같은 λ§€ν¬λ‘œμ™€ ν˜•μ„ λ‹€λ₯΄κ²Œ μ •μ˜ν•˜λŠ” 일을 막을 수 μžˆλ‹€.



πŸ“ Sharing Function Prototypes

ν•¨μˆ˜μ˜ μ›ν˜•μ΄ μ •μ˜λ˜κΈ° 전에 ν˜ΈμΆœλ˜λŠ” 것을 막기 μœ„ν•΄ 헀더 νŒŒμΌμ— ν•¨μˆ˜μ˜ μ›ν˜•μ„ λ„£μ–΄μ£Όλ©΄ λœλ‹€.

예λ₯Ό λ“€μ–΄ foo.c에 fλΌλŠ” ν•¨μˆ˜κ°€ μ„ μ–Έλ˜μ–΄ μžˆλ‹€λ©΄ foo.hλΌλŠ” ν—€λ”νŒŒμΌμ„ λ§Œλ“€μ–΄ f의 ν•¨μˆ˜ μ›ν˜•μ„ λ„£κ³ , foo.hλ₯Ό foo.c와 fλ₯Ό ν˜ΈμΆœν•˜λŠ” μ†ŒμŠ€ νŒŒμΌμ— μΆ”κ°€ν•΄μ€€λ‹€.

πŸ”Ž μ˜ˆμ‹œ (stack)




πŸ“ Sharing Variable Declarations

μ™ΈλΆ€λ³€μˆ˜λŠ” ν•¨μˆ˜μ™€ 같은 λ°©λ²•μœΌλ‘œ 파일끼리 κ³΅μœ ν•  수 μžˆλ‹€.

μ•„λž˜μ˜ 경우 iλ₯Ό μ„ μ–Έν•˜κ³  μ •μ˜λ„ ν•΄μ€€λ‹€.

int i

λ§Œμ•½ λ³€μˆ˜λ₯Ό μ •μ˜ν•˜μ§€ μ•Šκ³  μ„ μ–Έλ§Œ ν•΄μ£Όλ €λ©΄ extern ν‚€μ›Œλ“œλ₯Ό μ΄μš©ν•˜λ©΄ λœλ‹€.

extern int i;

이 경우 μ»΄νŒŒμΌλŸ¬λŠ” μ΄λŸ¬ν•œ νŒŒμΌλ“€μ— λŒ€ν•΄ 각각 i의 곡간을 μ „λΆ€ ν• λ‹Ήν•΄μ£Όμ§€λŠ” μ•ŠλŠ”λ‹€.

λ³€μˆ˜λ₯Ό 파일 κ°„ 곡유λ₯Ό ν•  땐 λ™μΌν•œ λ³€μˆ˜κ°€ μ„œλ‘œ λ‹€λ₯Έ νŒŒμΌμ—μ„œ λ‹€λ₯΄κ²Œ μ„ μ–Έλ˜μ§€ μ•Šλ„λ‘ μ£Όμ˜ν•΄μ•Ό ν•œλ‹€.

파일 κ°„ λ³€μˆ˜λ₯Ό κ³΅μœ ν•˜λŠ” 것은 λͺ‡ 가지 단점듀이 μžˆλ‹€.




πŸ“ Nested Includes (λ‚΄λΆ€ μΈν΄λ£¨λ“œ)

헀더 νŒŒμΌμ—μ„œλ„ #include μ§€μ‹œμžλ₯Ό μ΄μš©ν•  수 μžˆλ‹€.
예λ₯Ό λ“€μ–΄ stack.h에 boolean.h νŒŒμΌμ„ 좔가해쀄 수 μžˆλ‹€.




πŸ“ Protecting Header Files

같은 헀더 파일이 두 번 μΆ”κ°€λ˜λŠ” 것을 막아주어야 ν•œλ‹€. 헀더 νŒŒμΌμ„ λ³΄ν˜Έν•˜κΈ° μœ„ν•΄μ„œλŠ” 파일의 λ‚΄μš©λ¬Όμ„ #ifndef-#endif둜 감싸주면 λœλ‹€.

#ifndef BOOLEAN_H
#define BOOLEAN_H

#define TRUE 1
#define FALSE 0
typedef int Bool;

#endif

이 νŒŒμΌμ„ 처음 μΆ”κ°€ν•  땐 BOOLEAN_H λ§€ν¬λ‘œκ°€ μ •μ˜λ˜μ–΄μžˆμ§€ μ•ŠμœΌλ―€λ‘œ μ „μ²˜λ¦¬λŠ” #ifndef와 #endif μ‚¬μ΄μ˜ 쀄듀을 κ·ΈλŒ€λ‘œ 내버렀 λ‘˜ 것이닀. κ·ΈλŸ¬λ‚˜ λ‹€μŒμ—λŠ” κ·Έ 사이 쀄듀을 μ—†μ•€λ‹€.




πŸ“ #error Directives in Header Files

#error μ§€μ‹œμžλŠ” 주둜 헀더 파일 μ•ˆμ—μ„œ 헀더 파일이 μΆ”κ°€λ˜μ§€ 말아야 ν•  쑰건듀을 확인할 λ•Œ μ‚¬μš©λ˜κ³€ ν•œλ‹€.

πŸ”Ž μ˜›λ‚  λΉ„ν‘œμ€€ 컴파일러 μ‚¬μš© 방지

#ifndef __STDC__
#error This header requires a Standard C compiler
#endif



πŸ“ Dividing a Program into Files

πŸ”Ž justify(ν…μŠ€νŠΈ μ„œμ‹ ν”„λ‘œκ·Έλž¨)에 quote 파일 λ„£κΈ°

justify

   C     is quirky,  flawed,    and  an
enormous   success.      Although accidents of   history
 surely  helped,   it evidently    satisfied   a   need

    for  a   system  implementation    language    efficient
 enough   to  displace         assembly   language,
   yet sufficiently   abstract   and fluent    to describe
  algorithms   and     interactions    in a   wide   variety
of   environments.
                     --      Dennis     M.        Ritchie

이 ν”„λ‘œκ·Έλž¨μ„ UNIX ν˜Ήμ€ Windows ν”„λ‘¬ν”„νŠΈμ—μ„œ μ‹€ν–‰ν•˜κΈ° μœ„ν•΄μ„œλŠ” μ•„λž˜ λͺ…λ Ήμ–΄λ₯Ό μ‹€ν–‰ν•΄μ•Ό ν•œλ‹€.

justify <quote

< (input redirection) : justifyκ°€ μž…λ ₯을 ν‚€λ³΄λ“œμ—μ„œ λ°›λŠ” λŒ€μ‹  OS둜 ν•˜μ—¬κΈˆ quote λΌλŠ” νŒŒμΌμ—μ„œλΆ€ν„° 받도둝 ν•œλ‹€.

μœ„ λͺ…λ Ήμ–΄λ₯Ό μ‹€ν–‰ν•˜κ³  λ‚˜λ©΄ λ‹€μŒκ³Ό 같이 좜λ ₯λœλ‹€.

C is quirky,  flawed,  and  an  enormous  success.  Although
accidents of history surely helped, it evidently satisfied a
need for a system implementation language  efficient  enough
to displace assembly language, yet sufficiently abstract and
fluent to describe algorithms and  interactions  in  a  wide
variety of environments. -- Dennis M. Ritchie

output redirection을 μ΄μš©ν•˜λ©΄ μ €μž₯ν•΄ 쀄 수 μžˆλ‹€.
μ•„λž˜ λͺ…λ Ήμ–΄λ₯Ό 톡해 newquote에 좜λ ₯된 λ‚΄μš©μ„ μ €μž₯ν•  수 μžˆλ‹€.

justify <quote >newquote

justify에 λŒ€ν•΄ μΆ”κ°€μ μœΌλ‘œ μ•Œμ•„λ³΄λ©΄ λΆˆν•„μš”ν•œ λ„μ–΄μ“°κΈ°λ‚˜ 빈 쀄이 μ œκ±°λ˜μ–΄ μ •λ ¬λœλ‹€. λ˜ν•œ 20개의 λ¬Έμžλ³΄λ‹€ 더 κΈ΄ 단어λ₯Ό 읽게 되면 20개 μ΄ν›„μ˜ λ¬Έμžλ“€μ„ λ¬΄μ‹œν•˜κ³  λ³„ν‘œλ‘œ λŒ€μ²΄ν•œλ‹€.

예λ₯Ό λ“€μ–΄ antidisestablishmentarianismλŠ” antidisestablishment* 둜 좜λ ₯λœλ‹€.

이제 ν”„λ‘œκ·Έλž¨μ„ μ„€κ³„ν•΄λ³΄μž. λ¨Όμ € 단어듀을 λ‹΄κ³  μžˆμ„ 버퍼가 ν•„μš”ν•˜λ‹€. 단어와 κ΄€λ ¨λœ ν•¨μˆ˜λ“€μ„ ν•œ 파일(word.c)에 λ„£κ³ , 쀄 버퍼와 κ΄€λ ¨λœ ν•¨μˆ˜λ“€μ€ λ‹€λ₯Έ 파일(line.c)에 넣을 수 μžˆλ‹€. 또 justify.c에 mainν•¨μˆ˜λ₯Ό λ„£μ–΄μ€€λ‹€.

πŸ”Ž word.c

#include <stdio.h>

#include "word.h"

int read_char(void)
{
    int ch = getchar();

    if (ch == '\n' || ch == '\t') {
         return ' ';
    }
    return ch;
}

void read_word(char* out_word, int len) {
    int ch = 0;
    int pos = 0;

    while ((ch = read_char()) == ' ') {
    }

    while (ch != ' ' && ch != EOF) {
        if (pos < len) {
            word[pos++] = ch;
        }
        ch = read_char();
    }
    word[pos] = '\0';
}

πŸ”Ž line.c

#include <stdio.h>
#include <string.h>

#include "line.h"

#define MAX_LINE_LEN 60

char g_line[MAX_LINE_LEN + 1];
int g_line_len = 0;
int g_num_words = 0;

void clear_line(void)
{
    g_line[0] = '\0';
    g_line_len = 0;
    g_num_words = 0;
}

void add_word(const char *word)
{
    if (g_num_words > 0) {
        g_line[g_line_len] = ' ';
        g_line[g_line_len+1] = '\0';
        g_line_len++;
    }
    strcat(g_line, word);
    g_line_len += strlen(word);
    g_num_words++;
}

int get_space_remaining(void)
{
    return MAX_LINE_LEN - g_line_len;
}

void write_line(void)
{
    int extra_spaces = MAX_LINE_LEN - g_line_len;
    int space_to_insert = 0;

    for (int i = 0; i < g_line_len; i++) {
        if (g_line[i] != ' ') {
            putchar(g_line[i]);
        } else {
            space_to_insert = extra_spaces / (g_num_words - 1);
            for (int j = 1; j <= space_to_insert + 1; j++) {
                putchar(' ');
            }
            extra_spaces -= space_to_insert;
            g_num_words--;
        }
    }
    putchar('\n');
}

void flush_line(void)
{
    if (g_line_len > 0)
        puts(g_line);
}

πŸ”Ž justify.c

/* κΈ€μžλ‘œ 이루어진 νŒŒμΌμ„ μ •λ ¬ν•΄μ€€λ‹€. */

#include <string.h>

#include "line.h"
#include "word.h"

#define MAX_WORD_LEN 20

int main(void)
{
    char word[MAX_WORD_LEN + 2];
    int word_len;

    clear_line();
    for (;;) {
        read_word(word, MAX_WORD_LEN+1);
        word_len = strlen(word);
        if (word_len == 0) {
            flush_line();
            return 0;
        }
        if (word_len > MAX_WORD_LEN) {
            word[MAX_WORD_LEN] = '*';
        }
        if (word_len + 1 > space_remaining()) {
            write_line();
            clear_line();
        }
        add_word(word);
    }
}



πŸ“ Building a Multiple-File Program

1) 컴파일 : ν”„λ‘œκ·Έλž¨μ˜ 각 μ†ŒμŠ€ νŒŒμΌλ“€μ€ λ…λ¦½μ μœΌλ‘œ μ»΄νŒŒμΌλ˜μ–΄μ•Ό ν•œλ‹€. (ν—€λ”νŒŒμΌμ€ μ»΄νŒŒμΌν•  ν•„μš”X)
각 μ†ŒμŠ€ νŒŒμΌλ§ˆλ‹€ μ»΄νŒŒμΌλŸ¬λŠ” λͺ©μ  μ½”λ“œλ₯Ό ν¬ν•¨ν•˜λŠ” 파일인 λͺ©μ  파일(object file)을 μƒμ„±ν•œλ‹€. windowsμ—μ„œλŠ” .obj ν™•μž₯자λ₯Ό 가진닀.

2) 링크 : λ§μ»€λŠ” μ „ λ‹¨κ³„μ—μ„œ μƒμ„±ν•œ λͺ©μ  νŒŒμΌμ„ 라이브러리 ν•¨μˆ˜λ₯Ό μœ„ν•œ μ½”λ“œμ™€ μ—°κ²°ν•΄μ£Όμ–΄ μ‹€ν–‰ κ°€λŠ₯ν•œ νŒŒμΌμ„ μƒμ„±ν•œλ‹€.




πŸ“ Makefiles

λͺ…λ Ή 쀄에 λͺ¨λ“  μ†ŒμŠ€ νŒŒμΌμ„ μ λŠ” 것은 μ‹œκ°„ λ‚­λΉ„ μ΄λ―€λ‘œ UNIXλŠ” λ©”μ΄ν¬νŒŒμΌ(makefile)μ΄λΌλŠ” κ°œλ…μ„ λ§Œλ“€μ—ˆλ‹€. λ©”μ΄ν¬νŒŒμΌμ€ νŒŒμΌλ“€μ„ μˆ˜λ‘ν•˜λ©°, 파일 κ°„μ˜ 쒅속성(dependencies)λ˜ν•œ λͺ…μ‹œν•œλ‹€.

πŸ”Ž justify ν”„λ‘œκ·Έλž¨μ„ μœ„ν•œ UNIX λ©”μ΄ν¬νŒŒμΌ

justify: justify.o word.o line.o
    gcc -o justify justify.o word.o line.o

justify.o: justify.c word.h line.h
    gcc -c justify.c

word.o: word.c word.h
    gcc -c word.c

line.o: line.c line.h
    gcc -c line.c

1) κ·œμΉ™(rule) : 각 λΆ€λΆ„
2) λͺ©ν‘œ(target) : 각 κ·œμΉ™μ˜ 첫 번째 쀄, κ·Έ λ’€λ‘œ 쒅속성이 μžˆλŠ” νŒŒμΌλ“€
3) λͺ…λ Ή(command) : λ‘λ²ˆμ§Έ 쀄, λͺ©ν‘œκ°€ μ’…μ†λ˜μ–΄ μžˆλŠ” 파일이 μˆ˜μ •λ˜μ–΄ λͺ©ν‘œλ₯Ό μž¬κ΅¬μΆ•ν•΄μ•Ό ν•  경우 μ‹€ν–‰

예λ₯Ό λ“€μ–΄ 첫번째 κ·œμΉ™μ—μ„œλŠ” justifyκ°€ λͺ©ν‘œμ΄λ©° justifyκ°€ justify.o, word.o, line.o에 μ’…μ†λ˜μ–΄ μžˆλ‹€. ν”„λ‘œκ·Έλž¨μ΄ κ°€μž₯ μ΅œκ·Όμ— κ΅¬μΆ•λ˜μ—ˆμ„ λ•Œ 이 3가지 쀑 ν•˜λ‚˜λΌλ„ 변경사항이 μžˆλ‹€λ©΄ justifyλŠ” μž¬κ΅¬μΆ•μ„ ν•΄μ•Ό ν•œλ‹€.

μΆ”κ°€μ μœΌλ‘œ gcc -c justify.cμ—μ„œ -cλŠ” justify.cλ₯Ό λͺ©μ  파일둜 μ»΄νŒŒμΌν•˜λ˜ λ§ν¬λŠ” ν•˜μ§€ λ§λΌλŠ” μ˜λ―Έμ΄λ‹€.

μ΄λŸ°μ‹μœΌλ‘œ ν”„λ‘œκ·Έλž¨μ„ μœ„ν•œ λ©”μ΄ν¬νŒŒμΌμ„ ν˜•μ„±ν•œ 이후 make κΈ°λŠ₯을 μ΄μš©ν•˜μ—¬ ν”„λ‘œκ·Έλž¨μ„ ꡬ좕할 수 μžˆλ‹€. 각 파일의 μ‹œκ°„, λ‚ μ§œλ₯Ό ν™•μΈν•˜μ—¬ μ΅œμ‹  μ—¬λΆ€λ₯Ό νŒλ‹¨ν•  수 있고 μž¬κ΅¬μΆ•μ΄ κ°€λŠ₯ν•˜λ‹€.

πŸ”Ž make와 κ΄€λ ¨ν•˜μ—¬ μ•Œμ•„μ•Ό ν•˜λŠ” 사항

1) 메이크 파일의 각 λͺ…령은 μŠ€νŽ˜μ΄μŠ€κ°€ μ•„λ‹Œ νƒ­ 문자둜 띄어 μ“΄λ‹€.

2) λ©”μ΄ν¬νŒŒμΌμ€ 보톡 Makefile(λ˜λŠ” makefile)μ΄λΌλŠ” μ΄λ¦„μœΌλ‘œ μ €μž₯ν•œλ‹€.

3) makeλ₯Ό μ‹€ν–‰ν•˜λ €λ©΄ μ•„λž˜ λͺ…λ Ήμ–΄λ₯Ό μ‹€ν–‰ν•˜λ©΄ λœλ‹€.

make target 

μ—¬κΈ°μ„œ target(λͺ©ν‘œ)은 makefile에 수둝된 λͺ©ν‘œμ€‘ ν•˜λ‚˜μ΄λ©° νŠΉμ • λͺ©ν‘œλ₯Ό λͺ…μ‹œν•˜μ§€ μ•Šμ„ 경우 첫 번째 κ·œμΉ™μ˜ λͺ©ν‘œλ₯Ό κ΅¬μΆ•ν•œλ‹€.




πŸ“ Errors During Linking

컴파일 λ•Œ κ²€μΆœν•˜μ§€ λͺ»ν•œ λͺ‡λͺ‡ 였λ₯˜λ“€μ€ 링크할 λ•Œ κ²€μΆœλ˜κΈ°λ„ ν•œλ‹€. 특히 ν”„λ‘œκ·Έλž¨ 내에 μ–΄λ–€ ν•¨μˆ˜λ‚˜ λ³€μˆ˜μ˜ μ •μ˜κ°€ μƒλž΅λ˜μ–΄ μžˆμ„ 경우 λ―Έμ •μ˜λœ 기호(undefined symbol) λ˜λŠ” λ―Έμ •μ˜λ„λ‹ˆ μ°Έμ‘°(undefined reference)와 같은 λ©”μ‹œμ§€λ₯Ό 좜λ ₯ν•œλ‹€.

πŸ”Ž 링컀 였λ₯˜μ˜ ν”ν•œ 원인

1) μ˜€νƒ€
2) λˆ„λ½λœ 파일
3) λˆ„λ½λœ 라이브러리




πŸ“ Rebuiling a Program

ν”„λ‘œκ·Έλž¨μ„ λ‹€μ‹œ 컴파일 ν•˜λŠ” 경우 μ‹œκ°„μ„ μ ˆμ•½ν•˜κΈ° μœ„ν•΄ μ˜€λ‘œμ§€ 졜근 λ³€κ²½ 사항에 ν•΄λ‹Ήν•˜λŠ” νŒŒμΌλ“€λ§Œ 재컴파일 ν•΄μ•Ό ν•œλ‹€.

μž¬μ»΄νŒŒμΌν•΄μ•Ό ν•˜λŠ” 파일(λ³€ν™”κ°€ μžˆλŠ” 파일)이 λͺ‡ κ°œμΈμ§€ 보기 μœ„ν•΄μ„œλŠ” 두 가지 경우λ₯Ό κ³ λ €ν•΄μ•Ό ν•œλ‹€.

1) λ³€ν™”κ°€ μ˜€λ‘œμ§€ ν•œ μ†ŒμŠ€ νŒŒμΌμ—λ§Œ 영ν–₯을 μ£ΌλŠ” 경우
이 경우 ν•΄λ‹Ή 파일만 재컴파일 λ˜μ–΄μ•Ό ν•œλ‹€.

2) ν•œ 헀더 νŒŒμΌμ— μˆ˜μ •μ‚¬ν•­μ΄ μžˆμ„ 경우
이 경우 ν•΄λ‹Ή 헀더 νŒŒμΌμ„ μΆ”κ°€ν•œ λͺ¨λ“  파일이 영ν–₯을 받을 수 μžˆμœΌλ―€λ‘œ λͺ¨λ‘ μž¬μ»΄νŒŒμΌν•΄μ•Ό ν•œλ‹€.

justify.c word.cλŠ” 재컴파일 ν•˜κ³ , line.cλŠ” 재컴파일 ν•˜μ§€ μ•Šμ•„λ„ λ˜λŠ” 경우 μ•„λž˜μ˜ λͺ…령을 μ‚¬μš©ν•˜λ©΄ λœλ‹€. (gcc 컴파일러 κΈ°μ€€)

gcc -o justify justify.c word.c line.o

line.cλŠ” 재컴파일 ν•˜μ§€ μ•Šμ•„λ„ λ˜λ―€λ‘œ line.o λ₯Ό μ‚¬μš©ν•˜μ˜€λ‹€.

makefile을 μ‚¬μš©ν•˜λŠ” μž₯점 쀑 ν•˜λ‚˜λŠ” μž¬κ΅¬μΆ•μ΄ μžλ™μœΌλ‘œ μ²˜λ¦¬κ°€ λœλ‹€λŠ” 것이닀. 각 파일의 λ‚ μ§œμ™€ μ‹œκ°„μ„ νŒŒμ•…ν•œ ν›„ μˆ˜μ •λœ 파일과 μ’…μ†λœ νŒŒμΌλ“€μ„ λͺ¨λ‘ 재컴파일 ν•œλ‹€.

πŸ”Ž justify ν”„λ‘œκ·Έλž¨μ„ μž¬κ΅¬μΆ•ν•  경우 makeκ°€ ν•˜λŠ” 행동

1) justify.cλ₯Ό μ»΄νŒŒμΌν•˜μ—¬ justify.o ꡬ좕
2) word.c 컴파일 ν•˜μ—¬ word.o ꡬ좕
3) justify.o, word.o, line.oλ₯Ό λ§ν¬ν•˜μ—¬ justify ꡬ좕




πŸ“ Defining Macros Outside a Program

ν”„λ‘œκ·Έλž¨ νŒŒμΌμ„ μˆ˜μ •ν•˜μ§€ μ•Šκ³ λ„ 맀크둜의 값을 μˆ˜μ •ν•  수 μžˆλ‹€.

λŒ€λΆ€λΆ„μ˜ μ»΄νŒŒμΌλŸ¬λŠ” λͺ…λ Ή μ€„μ—μ„œ 맀크둜의 값을 μ •ν•  수 μžˆλŠ” -D μ˜΅μ…˜μ„ μ§€μ›ν•œλ‹€.

gcc -DDEBUG=1 foo.c

이 경우 foo.cμ—μ„œ DUBUG 맀크둜의 값이 1둜 μ •μ˜λ„λ‹ˆλ‹€.

λ˜ν•œ 맀크둜λ₯Ό λ―Έμ •μ˜ μ‹œμΌœμ£ΌλŠ” -U μ˜΅μ…˜λ„ μ‘΄μž¬ν•œλ‹€.



profile
κ³΅λΆ€μ •λ¦¬μš©
post-custom-banner

0개의 λŒ“κΈ€