比如一個文件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;
}
#ifndef __test__a__
#define __test__a__
#include <stdio.h>
extern int a;
void call();
#endif /* defined(__test__a__) */
#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方法沒有定義$ gcc -c a.c
再鏈接a.o和main.o$ gcc -o main main.o a.o
成功$ ./main
輸出
Hello, World!
abcdefg