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;利用靜態函式庫編譯成的檔案比較大,因為整個函式庫的所有資料都會被整合進目的碼中,他的優點就顯而易見了
linux下g++ 編譯時動態庫和靜態庫的連結和標頭檔案問題
原來編譯的時候都是用的很隨意,沒用系統的總結一下,這幾天在編譯的時候遇到一些下問題,於是就總結一下,省得過幾天又給忘了。 1.動態庫和靜態庫簡介 靜態庫在程式連結的時候會自動的連結到程式裡,所以一旦編譯完成,靜態庫就不需要了,靜態庫以.a結尾。 動態庫在編譯時不會被連線到目的碼中,而是在程式執行
linux 下編譯生成靜態庫和動態庫
我們此處為了說明靜態庫和動態庫的編譯,會使用示例程式碼。建立 test.h, hello.cpp 和 world.cpp, 在兩個原始檔中分別實現兩個函式( 此處都是示例程式碼,檔案命名不規範,理解意思即可 )。test.h (靜態庫標頭檔案)#ifndef _TEST_
淺析靜態庫和動態庫的區別及linux下二者的生成和使用
從程式設計的角度來講,庫檔案通常被分為靜態庫檔案和動態庫檔案,其目的在於將部分程式碼封裝在一起編譯後供自己或他人呼叫,好處在於編譯後的庫檔案看不到原始碼,可保密,同時不會因為不小心修改了函式而出問題,便於維護。但是二者之間存在一定的差異。 1.靜態庫: &n
Linux下用Makefile製作動態庫和靜態庫並編譯生成可執行程式
Makefile 一個工程中的原始檔不計其數,其按型別、功能、模組分別放在若干個目錄中,makefile定義了一系列的規則來指定,哪些檔案需要先編譯,哪些檔案需要後編譯,哪些檔案需要重新
Linux下gcc編譯器生成和使用靜態庫和動態庫學習筆記
我們通常把一些公用函式製作成函式庫,供其它程式使用。函式庫分為靜態庫和動態庫兩種。靜態庫在程式編譯時會被連結並拷貝到目的碼中,程式執行時將不再需要該靜態庫。動態庫在程式編譯時並不會被拷貝到目的碼中,而是在程式執行時才被載入,因此在程式執行時還需要動態庫存在。本質上說庫是一
Linux下gcc生成和使用靜態庫和動態庫詳解
一、基本概念 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 什麽是庫 庫是寫好的,現有的,成熟的,可以復用的代碼。現實中每個程序都要依賴很多基礎的底層庫,不可能每個人的代碼都從零開始,因此庫的存在意義非同尋常。 本質上來說,庫是一種可