91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何理解linux鏈接編譯

發布時間:2021-10-08 13:58:23 來源:億速云 閱讀:137 作者:iii 欄目:開發技術

本篇內容主要講解“如何理解linux鏈接編譯”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“如何理解linux鏈接編譯”吧!

為什么要包含頭文件而不是.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

到此,相信大家對“如何理解linux鏈接編譯”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

望奎县| 阿尔山市| 阿巴嘎旗| 乐都县| 浠水县| 隆回县| 桐庐县| 云阳县| 肇源县| 阿坝县| 轮台县| 新乡市| 会东县| 三河市| 白山市| 利辛县| 米易县| 周至县| 平山县| 河曲县| 阿拉善盟| 正镶白旗| 江西省| 安泽县| 城市| 崇州市| 永川市| 江永县| 古蔺县| 永泰县| 巍山| 蒲江县| 长岭县| 郯城县| 邢台市| 平乐县| 新河县| 广丰县| 班戈县| 香河县| 镇江市|