linux鏈接編譯詳解
為什么要包含頭文件而不是.c文件
測(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: 在函數(shù)‘test'中:
t.c:3:2: 警告: 隱式聲明函數(shù)‘putchar' [-Wimplicit-function-declaration]
編譯通過(guò),只有一個(gè)警告,生成了可執(zhí)行文件m,運(yùn)行它正常,輸出一空格。
修改下t.c 文件:
#include<stdio.h>
void test()
{
printf("test\n");
}
編譯后執(zhí)行
輸出: test
從這可看出,包含.c文件進(jìn)去對(duì)程序并沒(méi)造成什么影響,反而比包含.h文件來(lái)得直接方便,這里主要考慮到大型項(xiàng)目中,各文件直接的聯(lián)系,如A.c文件中包好M.c文件,B.c 文件中包含M.c文件,而A.c文件又包含B.c文件,那么編譯時(shí)就會(huì)報(bào)錯(cuò),函數(shù)名重定義了。
#include<>與#include""的區(qū)別:
對(duì)于用角括號(hào)包含的頭文件,gcc 首先查找-I選項(xiàng)指定的目錄,然后查找系統(tǒng)的頭文件目錄(通常是/usr/include,在我的系統(tǒng)上還包括/usr/lib/gcc/i486-linux-gnu/4.3.2/include);而對(duì)于用引號(hào)包含的頭文件,gcc 首先查找包含頭文件的.c文件所在的目錄,然后查找-I選項(xiàng)指定的目錄,最后再查找系統(tǒng)的頭文件目錄。
靜態(tài)庫(kù)
/* 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個(gè).c文件和一個(gè).h文件放在同目錄下,在當(dāng)前目錄下新建一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
編譯后執(zhí)行./main
顯示:a
反編譯指令: 查看反編譯后程序
objdump -d main
相關(guān)文章
Shell中使用plink工具實(shí)現(xiàn)遠(yuǎn)程批量關(guān)機(jī)
這篇文章主要介紹了Shell中使用plink工具實(shí)現(xiàn)遠(yuǎn)程批量關(guān)機(jī),Plink 是命令行工具,執(zhí)行遠(yuǎn)程服務(wù)器上的命令,需要的朋友可以參考下2014-12-12linux使用管道命令執(zhí)行ps獲取cpu與內(nèi)存占用率
這篇文章主要介紹了linux使用管道命令執(zhí)行ps獲取cpu與內(nèi)存占用率的示例,需要的朋友可以參考下2014-02-02Shell腳本變量的只讀?刪除?類(lèi)型及注釋語(yǔ)法基礎(chǔ)
這篇文章主要介紹了Shell腳本變量的只讀刪除類(lèi)型及注釋語(yǔ)法基礎(chǔ)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05Shell實(shí)現(xiàn)日期的獲取、設(shè)置和延時(shí)操作
本文主要介紹了Shell實(shí)現(xiàn)日期的獲取、設(shè)置和延時(shí)操作,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07一個(gè)下載網(wǎng)頁(yè)圖片的shell腳本
這篇文章主要介紹了一個(gè)下載網(wǎng)頁(yè)圖片的shell腳本,需要的朋友可以參考下2014-03-03詳解Linux定時(shí)任務(wù)Crontab的介紹與使用
linux內(nèi)置的cron進(jìn)程能幫我們實(shí)現(xiàn)這些需求,cron搭配shell腳本,非常復(fù)雜的指令也沒(méi)有問(wèn)題。本文主要介紹了定時(shí)任務(wù)Crontab的使用,需要的可以學(xué)習(xí)一下2022-10-10