1. 程式人生 > >編譯小結(7)Automake編譯靜態庫與動態庫

編譯小結(7)Automake編譯靜態庫與動態庫


  具體記錄下,如何用Automake編譯靜態庫(.a)與動態庫(.so)的流程.   步驟其實都是一樣的,只有configure.in 與 Makefile.am 有區別。 一。靜態庫(.a)         configure.in :
   # -*- Autoconf -*- # Process this file with autoconf to produce a configure script. AC_PREREQ([2.63]) #AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS]) AC_INIT(add.c)
AM_INIT_AUTOMAKE(libcalc.la,1.0) #AC_INIT(libcalc.a,1.0,[]) #AM_INIT_AUTOMAKE AC_CONFIG_SRCDIR([add.c]) AC_CONFIG_HEADERS([config.h]) # Checks for programs. AC_PROG_CC AC_PROG_RANLIB AC_PROG_LIBTOOL # Checks for libraries. # Checks for header files. # Checks for typedefs, structures, and compiler characteristics. # Checks for library functions. #AC_CONFIG_FILES([Makefile]) AC_OUTPUT(Makefile) 編譯靜態庫需要加上 AC_PROG_RANLIB  
   Makefile.am:
#author: XCL AUTOMAKE_OPTIONS=foreign #noinst_LIBRARIES=libcalc.la lib_LTLIBRARIES = libcalc.la libcalc_la_LDFLAGES = -fPIC -m64 libcalc_la_SOURCES=add.c sub.c 如果只想編譯靜態庫,但不想安裝到系統中,用noinst_LIBRARIES 代替lib_LTLIBRARIES .所以noinst的比較常見。
二。動態庫(.so)    configure.in :
# -*- Autoconf -*- # Process this file with autoconf to produce a configure script. AC_PREREQ([2.63]) #AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS]) #AC_INIT(add.c) #AM_INIT_AUTOMAKE(libcalc.so,1.0,
[email protected]
) AC_INIT(calc,1.0,[email protected]) AM_INIT_AUTOMAKE AC_CONFIG_SRCDIR([add.c]) AC_CONFIG_HEADERS([config.h]) # Checks for programs. AC_PROG_CC AC_PROG_LIBTOOL # Checks for libraries. # Checks for header files. # Checks for typedefs, structures, and compiler characteristics. # Checks for library functions. AC_OUTPUT(Makefile)
   Makefile.am:  #author: XCL
AUTOMAKE_OPTIONS=foreign lib_LTLIBRARIES = libcalc.la libcalc_la_SOURCES=add.c sub.c libcalc_la_LDFLAGES = -fPIC -m64
如果是C++動態庫則要用extern "C"將要匯出的函式包起來的。 再配合--retain-symbols-file 與  --version-script 兩個引數來實現Windows動態庫的def檔案功能。 例:
#if !defined(WIN32)
extern "C" //不加這個會亂碼
{
 MyINST * CreateInstance();
 void DestoryInstance( MyINST  * pInstance);
//__attribute__ ((visibility("default")))  MyINST  *  CreateInstance ()
//__attribute__ ((visibility("default"))) void  DestoryInstance ( MyINST  * pInstance)
}
#endif

另可以看看gcc與手寫Makefile編譯的寫法:

MAIL:  [email protected]

BLOG: http://blog.csdn.net/xcl168

相關推薦

編譯小結(7)Automake編譯靜態動態

  具體記錄下,如何用Automake編譯靜態庫(.a)與動態庫(.so)的流程.   步驟其實都是一樣的,只有configure.in 與 Makefile.am 有區別。 一。靜態庫(.a)

靜態動態的簡單說明

外部程序 endif ldconfig 開始 director 有時 鏈接 現在 con   一.靜態庫和動態庫的簡單介紹   程序設計的模塊化是人們一直在追求的目標,因為當一個系統十分復雜的時候,將系統模塊化既可以並行開發,又可以增強程序的可用性,降低程序間的耦合度。在一

深入探討Linux靜態動態的詳解(轉)

share 分享 命名 one .com 過程 程序 簡單介紹 mage 2.生成動態庫並使用 linux下編譯時通過 -shared 參數可以生成動態庫(.so)文件,如下 庫從本質上來說是一種可執行代碼的二進制格式,可以被載入內存中執行。庫分靜態庫和動態庫兩種。

Linux下靜態動態

Linux 靜態庫 動態庫 靜態庫 先說說我們為什麽需要庫?當有些代碼我們大量會在程序中使用比如(scanf,printf等)這些函數我們需要在程序中頻繁使用,於是我們就把這些代碼編譯為庫文件,在需要使用時我們直接鏈接即可。 定義: ?程序在編譯時把靜態庫的代碼鏈接到可執行程序中,在代碼運行時不再

【領卓教育】Linux--靜態動態(共享) 區別、製作和使用

1.概念和區別      靜態庫 :(1)libxxx.a ,程式在編譯時,將庫編譯 進可執行程式中!                     &nbs

VS2015靜態動態的使用

VS2015靜態庫與動態庫的使用 靜態庫 靜態庫建立(略),往往我們使用第三方的比較常見,如果要自己團隊間建立使用也很簡單; 標頭檔案的載入:  方式一: (1)將靜態庫給出的標頭檔案拷貝到專案目錄下(*.vcxproj所在的目錄); (2

CMake的hello world(三) 靜態動態構建

本系列都是學習<CMake實踐>這本書,書下載連結 https://download.csdn.net/download/hjxu2016/10741464 這次任務是建立一個靜態庫和動態庫, 提供helloFunc函式供其他程式程式設計使用,HelloFunc向終端輸出 H

HelloWorld CMake CMake中構建靜態動態及其使用

繼續完善Hello World,建立它的共享庫, 包括靜態庫和動態庫。   本節的任務: 1,建立一個靜態庫和動態庫,提供HelloFunc函式供其他程式程式設計使用,HelloFunc 向終端輸出Hello World字串。 2,安裝標頭檔案與

C++靜態動態

name mangling可以通過extern "C"解決。C++有個特定的關鍵字用來宣告採用C binding的函式:extern "C" 。用 extern "C"宣告的函式將使用函式名作符號名,就像C函式一樣。因此,只有非成員函式才能被宣告為extern "C",並且不能被過載。儘管限制多多,exter

CMake中構建靜態動態及其使用(CMakeLists的一些解釋)

本節的任務: 1,建立一個靜態庫和動態庫,提供HelloFunc函式供其他程式程式設計使用,HelloFunc 向終端輸出Hello World字串。 2,安裝標頭檔案與共享庫。 3, 編寫一個程式使用建立的共享庫(靜態庫和動態庫)。 cd /home/ccj/

LINUX靜態動態符號衝突問題分析解決

1. 問題重現模型 為了重現問題並去掉無關干擾細節,我們將構建一個最簡單的可執行模組和依賴模組的關係鏈,程式依賴模型如下: 1.1 解釋 (1)有一個名為RTSP的第三方庫提供了公共介面RTSP_OPEN,RTSP可以編譯為靜態庫libRTSP_ST

Linux下靜態動態(.a、.so)

ref:http://niefei.blog.ccidnet.com/blog/ccid/do_showone/tid_42855.html 1. 介紹   使用GNU的工具我們如何在Linux下建立自己的程式函式庫?一個“程式函式庫”簡單的說就是一個檔案包含了一些編譯好的程式碼和資料,這些編譯好的程式碼和資

《CMake實踐》筆記三:構建靜態動態 及 如何使用外部共享和標頭檔案

五、靜態庫與動態庫構建 讀者雲,太能羅唆了,一個Hello World就折騰了兩個大節。OK,從本節開始,我們不再折騰Hello World了,我們來折騰Hello World的共享庫。 本節的任務: 1、建立一個靜態庫和動態庫,提供HelloFunc函式供

Linux下的靜態動態

庫 在windows和Linux下都存在著大量的庫,庫是什麼呢?本質上來說,庫時一種可執行程式碼的二進位制形式,可以被作業系統載入記憶體執行。 庫有什麼用呢? 我們通常將一些公用函式寫成函式庫,所以庫是別人寫好的,現有的,成熟的,可以服用的程式碼,你可

cmake學習(一)靜態動態構建

因為預設規則是不能有相同名字的共享庫與靜態庫,所以當生成靜態庫的時候(so字尾),共享庫會被刪除,因為只能允許一個名字存在,相同名字的會被替代(hello),所以需要通過SET_TARGET_PROPERTIES()來解決這個問題,例子:

C++靜態動態詳解使用

這次分享的宗旨是——讓大家學會建立與使用靜態庫、動態庫,知道靜態庫與動態庫的區別,知道使用的時候如何選擇。這裡不深入介紹靜態庫、動態庫的底層格式,記憶體佈局等,有興趣的同學,推薦一本書《程式設計師的自我修養——連結、裝載與庫》。 什麼是庫 庫是寫好的現有的,成熟的,可以複用的程式碼。現實中每個程式都要依

vs中靜態動態的呼叫

解決問題:vs中如何呼叫庫。 1.什麼是庫 庫是寫好的現有的,成熟的,可以複用的程式碼。現實中每個程式都要依賴很多基礎的底層庫。 本質上來說庫是一種可執行程式碼的二進位制形式,可以被作業系統載入記憶體執行。 庫有兩種:靜態庫(.a、.lib)和動態庫(.so、.dll

C++靜態動態、建立及呼叫方法

1 什麼是庫 庫是寫好的現有的,成熟的,可以複用的程式碼。現實中每個程式都要依賴很多基礎的底層庫,不可能每個人的程式碼都從零開始,因此庫的存在意義非同尋常。本質上來說庫是一種可執行程式碼的二進位制形式,可以被作業系統載入記憶體執行。庫有兩種:靜態庫(.a、.lib)和動態

g++ 編譯連結C++程式碼, 生成使用靜態動態

例如我有A.cpp、A.h、main.cpp 三個檔案 編譯連結C++程式碼: 第一步:g++ -c A.cpp main.cpp 這樣就可以編譯A.cpp和main.cpp的程式碼生成A.o和main.o檔案【因為A.cpp包含了A.h的標頭檔案,所以一般編譯時

Android:JNINDK(二)交叉編譯動態靜態

  歡迎關注公眾號,第一時間獲取最新文章:   本篇目錄 一、前言 本篇主要以window開發環境為背景介紹一下NDK開發中需要掌握的交叉編譯等基礎知識,選window系統主要是照顧大多數讀者,mac ,linux作業系統基本是同樣適用的。 交叉編譯就是在A平臺編譯出可