include 包含

比如一個文件main.c,其包含a.h,a.h對應一個a.c,那麼1、如果直接編譯main.c是否可以成功呢?(沒有編譯a.c),2、如果鏈接是否可以成功呢?

main.c定義如下:

#include "a.h"


int main(int argc, const char * argv[]) {


    printf("Hello, World!\n");


    call();

    

    return 0;

}

a.h定義如下:

#ifndef __test__a__

#define __test__a__


#include <stdio.h>


extern int a;


void call();


#endif /* defined(__test__a__) */


a.c定義如下:

#include "a.h"


int a=10;


void call()

{

    printf("abcdefg\n");

}


$ gcc -c main.c

成功

gcc -o main main.c

系統提示:

Undefined symbols for architecture x86_64:

  "_call", referenced from:

      _main in main-34107c.o

ld: symbol(s) not found for architecture x86_64

clang: error: linker command failed with exit code 1 (use -v to see invocation)

就是說a.c裏面的call方法沒有定義
這個時候編譯a.c

$ gcc -c a.c

再鏈接a.o和main.o

$ gcc -o main main.o a.o

成功
執行main

$ ./main

輸出

Hello, World!

abcdefg









發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章