linux連結編譯詳解_linux shell

來源:互聯網
上載者:User


為什麼要包含標頭檔而不是.c檔案

測試代碼:

複製代碼 代碼如下:

m.c檔案:
#include"t.c"
int main()
{
test();
return 0;
}

編譯:

複製代碼 代碼如下:

gcc m.c -o m -Wall

In file included from m.c:1:0:
t.c: 在函數‘test'中:
t.c:3:2: 警告: 隱式聲明函數‘putchar' [-Wimplicit-function-declaration]
編譯通過,只有一個警告,產生了可執行檔m,運行它正常,輸出一空格。

修改下t.c 檔案:

複製代碼 代碼如下:

#include<stdio.h>
void test()
{
       printf("test\n");
}

編譯後執行

輸出:    test

從這可看出,包含.c檔案進去對程式並沒造成什麼影響,反而比包含.h檔案來得直接方便,這裡主要考慮到大型項目中,各檔案直接的聯絡,如A.c檔案中包好M.c檔案,B.c 檔案中包含M.c檔案,而A.c檔案又包含B.c檔案,那麼編譯時間就會報錯,函數名重定義了。
#include<>與#include""的區別:

對於用角括弧包含的標頭檔,gcc 首先尋找-I選項指定的目錄,然後尋找系統的標頭檔目錄(通常是/usr/include,在我的系統上還包括/usr/lib/gcc/i486-linux-gnu/4.3.2/include);而對於用引號包含的標頭檔,gcc 首先尋找包含標頭檔的.c檔案所在的目錄,然後尋找-I選項指定的目錄,最後再尋找系統的標頭檔目錄。

 
 靜態庫

複製代碼 代碼如下:

/* stack.c */
char stack[512];
int top = -1;

複製代碼 代碼如下:

/* push.c */
extern char stack[512];
extern int top;
void push(char c)
{
stack[++top] = c;
}

複製代碼 代碼如下:

/* pop.c */
extern char stack[512];
extern int top;
char pop(void)
{
return stack[top--];
}

複製代碼 代碼如下:

/* is_empty.c */
extern int top;
int is_empty(void)
{
return top == -1;
}

複製代碼 代碼如下:

/* stack.h */
#ifndef STACK_H
#define STACK_H
extern void push(char);
extern char pop(void);
extern int is_empty(void);
#endif

複製代碼 代碼如下:

/* main.c */
#include <stdio.h>
#include "stack.h"
int main(void)
{
   push('a');
   char c = pop();
   printf("%c\n",c);
   return 0;
}

將如上5個.c檔案和一個.h檔案放在同目錄下,在目前的目錄下建立一Makefile檔案,使用Makefile是編譯。

複製代碼 代碼如下:

main:libstack.a main.o
       gcc -o main main.o -L. -lstack
libstack.a: stack.o push.o pop.o is_empty.o
       ar rs libstack.a  stack.o push.o pop.o is_empty.o
stack.o:
       gcc -o stack.o -c stack.c
push.o
       gcc -o push.o -c push.c
pop.o:
       gcc -o pop.o -c pop.c
is_empty:
       gcc -o is_empty.o -c is_empty.c
main.o:
       gcc -o main.o -c main.c

編譯後執行./main
顯示:a

反編譯指令: 查看反編譯後程式

複製代碼 代碼如下:

objdump -d main

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.