1. 程式人生 > >linux下靜態庫和動態庫的通用生成模板

linux下靜態庫和動態庫的通用生成模板

                                                                    Makefile檔案的編寫

################################################################  
#自動將src目錄下所有的cpp、cc和c檔案編譯,生成所有.o檔案儲存在bin/obj下  
#自動生成靜態庫和動態庫檔案到lib目錄下  
#Created by hhsun 2018-06-2                
#################################################################   
PROJECT_TOP_DIR := $(shell pwd)
PROJECT_SRC_DIR := $(PROJECT_TOP_DIR)/src
PROJECT_INC_DIR := $(PROJECT_TOP_DIR)/inc
PROJECT_LIB_DIR := $(PROJECT_TOP_DIR)/lib
PROJECT_OBJ_DIR := $(PROJECT_TOP_DIR)/obj

COMPILER_DIR :=  /home/sunhh/work/txd-25/toolchain/CodeSourcery/Sourcery_CodeBench_Lite_for_Xilinx_GNU_Linux/bin/arm-xilinx-linux-gnueabi-

DATE := $(shell date '+%y-%m-%d-%H')  
CXX := $(COMPILER_DIR)g++  
STRIP := $(COMPILER_DIR)strip 

LIB_NAME := libatsha
AR := $(COMPILER_DIR)ar
SHARED_LIB := $(LIB_NAME).so
STATIC_LIB := $(LIB_NAME).a
TARGETS := $(SHARED_LIB) $(STATIC_LIB)

CXXFLAGS := -g -Wall -Werror -I$(PROJECT_INC_DIR)
LDFLAG := -L$(PROJECT_LIB_DIR)
ARFLAG := rcs
SOFLAG := -shared -fPIC
 
SRCS :=$(wildcard $(PROJECT_SRC_DIR)/*.cpp $(PROJECT_SRC_DIR)/*.cc $(PROJECT_SRC_DIR)/*.c)
SRCS_NODIR := $(notdir $(SRCS))
PROJECT_OBJ_CPP := $(patsubst %.cpp,%.o,$(SRCS_NODIR))
PROJECT_OBJ_CC := $(patsubst %.cc,%.o,$(PROJECT_OBJ_CPP))
PROJECT_OBJ_C := $(patsubst %.c,%.o,$(PROJECT_OBJ_CC))
PROJECT_ALL_OBJS := $(addprefix $(PROJECT_OBJ_DIR)/, $(PROJECT_OBJ_C))

all:$(TARGETS)
	@echo "-----------------------------------------------------------------------------"
	@echo "Build Completed for $(PROJECT_LIB_DIR)/$(TARGETS): $(TARGETS) build"
	@echo "-----------------------------------------------------------------------------"
$(STATIC_LIB): $(PROJECT_ALL_OBJS)
	$(AR) $(ARFLAG) $(PROJECT_LIB_DIR)/
[email protected]
$^ $(SHARED_LIB): $(PROJECT_ALL_OBJS) $(CXX) $(SOFLAG) -o $(PROJECT_LIB_DIR)/[email protected] $^ $(PROJECT_OBJ_DIR)/%.o: $(PROJECT_SRC_DIR)/%.cc $(CXX) -c $(CXXFLAGS) -o [email protected] $< $(PROJECT_OBJ_DIR)/%.o: $(PROJECT_SRC_DIR)/%.cpp $(CXX) -c $(CXXFLAGS) -o
[email protected]
$< $(PROJECT_OBJ_DIR)/%.o: $(PROJECT_SRC_DIR)/%.c $(CXX) -c $(CXXFLAGS) -o [email protected] $< .PHONY: clean clean: rm -fr $(PROJECT_OBJ_DIR)/*.o rm -fr $(PROJECT_LIB_DIR)/$(TARGETS)

注意:空格及轉換字元的影響,拷貝到linux下,需要檢查多餘的空格字元(每行末尾)

Makefile編寫學習:

1、偽目標的作用:https://www.cnblogs.com/hnrainll/archive/2011/04/12/2014082.html;

2、Makefile中的命令字首作用:連結的2.3小節 https://www.cnblogs.com/wang_yb/p/3990952.html;

3、常用函式的查詢:https://blog.csdn.net/yangxuan0261/article/details/52060582;

4、gcc -MM kvm_main.c  

-MM作用是檢視kvm_main.c的依賴關係

輸出:kvm_main.o: kvm_main.c iodev.h coalesced_mmio.h async_pf.h;

5、自動變數

Makefile 中很多時候通過自動變數來簡化書寫, 各個自動變數的含義如下:

自動變數

含義

[email protected]目標集合
$%當目標是函式庫檔案時, 表示其中的目標檔名
$<第一個依賴目標. 如果依賴目標是多個, 逐個表示依賴目標
$?比目標新的依賴目標的集合
$^所有依賴目標的集合, 會去除重複的依賴目標
$+所有依賴目標的集合, 不會去除重複的依賴目標
$*這個是GNU make特有的, 其它的make不一定支援

試試

6、gcc選項含義:

CFLAGS、CXXFLAGS、LDFLAGS與LIBS:https://blog.csdn.net/soaringlee_fighting/article/details/65448010

7、gcc編譯常用選項中     -Werror:它要求gcc將所有的警告當成錯誤進行處理;

                                     -fPIC選項:PIC指Position Independent Code。共享庫要求有此選項,以便實現動態連線

                                                        http://blog.sina.com.cn/s/blog_54f82cc201011op1.html

                                       ARFLAG := rcs:https://www.cnblogs.com/androidme/archive/2013/02/19/2917220.html

                                        -Dmacro:相當於C語言中的#define marcro巨集定義

8、$(MAKE):就是預設的 make 這個命令的名稱(或者路徑),https://www.cnblogs.com/nosadness/p/5136560.html

                                    distclean:

                                                           $(MAKE) -C gbuni clean    

                                    進入gbuni目錄進行make clean

相關推薦

linux 靜態路由動態路由的配置方式

靜態路由的配置 1.命令列新增靜態路由 首先開啟裝置的路由轉發功能,如果不開啟路由轉發功能,我們配置好路由表,也是不能完成路由的功能 #cat  /proc/sys/net/ipv4/ip_forward通過上面的命令我們可以發現,檔案ip_forward中預設的值為0,我們

linux靜態動態通用生成模板

                                                                    Makefile檔案的編寫#########################################################

linux靜態動態

列表 可執行文件 運行時 打包 文件的 ade 命令 div library 一、linux下的靜態庫 靜態庫中的被調用的函數的代碼會在編譯時一起被復制到可執行文件中去的!!可執行文件在運行不需要靜態庫的存在! 二、linux下動態庫的構建和使用 1、動態庫的構建

Linux靜態動態的製作使用

Linux作業系統支援的庫函式分為;   1.靜態庫:libxxx.a  在編譯時就將庫函式編譯進可執行程式中.      優點.  程式執行環境中不需要外部的函式庫.       缺點: 可執行程

Linux靜態動態(共享

Linux作業系統支援的函式庫分為靜態庫和動態庫,動態庫又稱共享庫。linux系統有幾個重要的目錄存放相應的函式庫,如/lib /usr/lib。 靜態函式庫:       這類庫的名字一般是libxxx.a;利用靜態函式庫編譯成的檔案比較大,因為整個函式庫的所有資料都會被整合進目的碼中,他的優點就顯而易見了

linuxg++ 編譯時動態靜態的連結標頭檔案問題

原來編譯的時候都是用的很隨意,沒用系統的總結一下,這幾天在編譯的時候遇到一些下問題,於是就總結一下,省得過幾天又給忘了。 1.動態庫和靜態庫簡介 靜態庫在程式連結的時候會自動的連結到程式裡,所以一旦編譯完成,靜態庫就不需要了,靜態庫以.a結尾。  動態庫在編譯時不會被連線到目的碼中,而是在程式執行

linux 編譯生成靜態動態

我們此處為了說明靜態庫和動態庫的編譯,會使用示例程式碼。建立  test.h, hello.cpp 和 world.cpp, 在兩個原始檔中分別實現兩個函式( 此處都是示例程式碼,檔案命名不規範,理解意思即可 )。test.h (靜態庫標頭檔案)#ifndef _TEST_

淺析靜態動態的區別及linux二者的生成使用

從程式設計的角度來講,庫檔案通常被分為靜態庫檔案和動態庫檔案,其目的在於將部分程式碼封裝在一起編譯後供自己或他人呼叫,好處在於編譯後的庫檔案看不到原始碼,可保密,同時不會因為不小心修改了函式而出問題,便於維護。但是二者之間存在一定的差異。     1.靜態庫:   &n

Linux用Makefile製作動態靜態並編譯生成可執行程式

Makefile 一個工程中的原始檔不計其數,其按型別、功能、模組分別放在若干個目錄中,makefile定義了一系列的規則來指定,哪些檔案需要先編譯,哪些檔案需要後編譯,哪些檔案需要重新

Linuxgcc編譯器生成使用靜態動態學習筆記

我們通常把一些公用函式製作成函式庫,供其它程式使用。函式庫分為靜態庫和動態庫兩種。靜態庫在程式編譯時會被連結並拷貝到目的碼中,程式執行時將不再需要該靜態庫。動態庫在程式編譯時並不會被拷貝到目的碼中,而是在程式執行時才被載入,因此在程式執行時還需要動態庫存在。本質上說庫是一

Linuxgcc生成使用靜態動態詳解

一、基本概念 1.1什麼是庫 在windows平臺和linux平臺下都大量存在著庫。 本質上來說庫是一種可執行程式碼的二進位制形式,可以被作業系統載入記憶體執行。 由於windows和linux的平臺不同(主要是編譯器、彙編器和聯結器的不同),因此二者庫的二

linux靜態動態使用的從無到有

首先我們先列出gcc編譯器的常用命令:我們在來看看gcc的編譯流程,因為我們在開發工具中玩了太久,一般都會忽略這些細節的:好,下面我們在來談一談靜態庫和動態庫關於靜態庫和動態庫的優點和結構實現我們就不BB了。ar是gnu歸檔工具,rcs表示(replace and creat

linux靜態動態詳解

  原文:http://blog.chinaunix.net/uid-23069658-id-3142046.html 今天我們主要來說說Linux系統下基於動態庫(.so)和靜態(.a)的程式那些貓膩。在這之前,我們需要了解一下原始碼到可執行程式之間到底發生了什麼神奇而

Linux靜態動態

文件拷貝 -shared info pri 歸檔文件 share 快捷 ima shared 函數庫分為靜態庫和動態庫 動態庫(格式為libname.so[.主版本號.次版本號.發行號])。在程序編譯時並不會被鏈接到目標代碼中,而是在程序運行時才被載入。 靜態庫是目標文件.

關於Linux靜態動態的分析

所在 mis color 先後 main 技術 哪些 共享 協議 關於Linux靜態庫和動態庫的分析 關於Linux靜態庫和動態庫的分析 1.什麽是庫 在windows平臺和linux平臺下都大量存在著庫。 本質上來說庫是一種可運行代碼的二進制形式。能夠被操作系

linux+vs2013編譯靜態動態

cal 控制 文件 urn 運行時 names c++ spec using Linux下創建與使用靜態庫 Linux靜態庫命名規則 Linux靜態庫命名規範,必須是"lib[your_library_name].a":lib為前綴,中間是靜態庫名,擴展名為.a。 創建靜態

linux 靜態動態(共享)的制作與使用(註意覆蓋問題)

png 環境變量 src bfile idt 鏈接器 問題 靜態 插入 一、linux操作系統支持的函數庫分支   靜態庫:libxxx.a,在編譯時就將庫編譯進可執行程序     優點:程序的運行環境中不需要外部的函數庫     缺點:可執行程序大   動態庫:又

Windows系統靜態動態的使用方法

系統 comment 入庫 自己 動態庫 lib windows系統 window ont 使用靜態庫時,我們需要別人提供的頭文件和lib文件,然後在自己的工程的源文件(.cpp文件)中添加頭文件和#pragma comment(lib, "靜態庫的路徑") 使用動態庫時

Windows系統靜態動態生成方法

fine end def imp XP fin windows 靜態 style 靜態庫的生成方法:直接創建靜態庫項目,寫好功能後,編譯生成即可,把頭文件和靜態庫提供給別人即可使用 動態庫的生成方法:創建動態庫項目,在頭文件中寫入: #ifdef DLLEXPORT #de

靜態動態的區別win平臺linux平臺代碼實現

linux動態庫 聲明 CP 控制臺程序 後綴 差異 創建 SM mes 什麽是庫   庫是寫好的,現有的,成熟的,可以復用的代碼。現實中每個程序都要依賴很多基礎的底層庫,不可能每個人的代碼都從零開始,因此庫的存在意義非同尋常。   本質上來說,庫是一種可