1. 程式人生 > >automake編寫完整的專案---動態庫+可執行檔案

automake編寫完整的專案---動態庫+可執行檔案

上一篇部落格automake簡介中簡單的介紹了automake的使用流程,但是真正的專案肯定是很複雜的,包含不同的目錄,有的生成動態庫,有的是可執行檔案,本文就用一個簡單的opencv專案來介紹一下automake在大型專案的使用方法。本文中,最外層包含兩個目錄,一個目錄是src,裡面是不同模組的原始檔,最後是要生成動態庫的;一個目錄是sample,裡面是一個應用程式,呼叫src中的動態庫生成可執行檔案,而src中又包含了不同的目錄,每個子目錄最後生成一的so動態庫,具體如下:其中,smooth、sharpen、segment分別生成三個動態庫,而processManage則呼叫他們三個也生成一個動態庫,最後sample中的main函式呼叫processManage提供的介面間接的呼叫smooth、sharpen、segment三個動態庫實現一個應用程式:


具體步驟如下:

1、在最外層目錄(和src、sample在同一級)執行autoscan命令生成autoscan.log和configure.scan檔案

2、mv configure.scan configure.ac且修改configure.ac(早期使用configure.in)

#                                               -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.

AC_PREREQ([2.68])
AC_INIT(segment, 1.0, email)            
AM_INIT_AUTOMAKE(segment,1.0)    #手動新增
AC_CONFIG_SRCDIR([sample/segment.cpp])  #用於檢測原始碼目錄的有效性,任選一個原始碼檔案即可
AC_CONFIG_HEADERS([config.h])

# Checks for programs.
AC_PROG_CXX
AC_PROG_CC

# Checks for libraries.
# Checks for header files.
# Checks for typedefs, structures, and compiler characteristics.
# Checks for library functions.

AC_CONFIG_FILES([Makefile src/Makefile src/smooth/Makefile src/sharpen/Makefile src/segment/Makefile src/processManage/Makefile sample/Makefile])   #需要生成的所有Makefile  
AC_OUTPUT

3、使用aclocal生成aclocal.m4檔案

4、執行autoconf命令生成configure檔案

5、執行autoheader命令生成config.h和config.h.in 

6、在每一個需要生成Makefile的目錄裡建立Makefile.am檔案

6.1:如果是父目錄(和src、sample在同一級),則必須包含SUBDIRS = src sample  (注意順序),相當於呼叫子目錄去生成Makefile,如果沒有其它的操作,則只有這一行即可.同理,src中的(和smooth、sharpen、segment、processManage同一級的)Makefile.am也只有一行,即

SUBDIRS = smooth sharpen segment processManage。對於smooth、sharpen和segment三個目錄中Makefile.am分別生成一個動態庫,方法類似,這裡給出smooth目錄中的Makefile.am:

INCLUDES = `pkg-config opencv --cflags` -I./   #標頭檔案的目錄
projectlibdir=$(libdir)
projectlib_PROGRAMS = libsmooth.so    #動態庫的名字
libsmooth_so_SOURCES = GaussSmooth.cpp MedianSmooth.cpp GaussSmooth.h Smooth.h
libsmooth_so_LDFLAGS = -shared -fpic #GCC編譯動態庫的選項
上面巨集的具體含義,參考上一篇部落格的表格

對於processManage中的Makefile.am,由於呼叫了另外三個so,所以稍微有點不同,具體如下:

INCLUDES = `pkg-config opencv --cflags` -I../smooth/ -I../sharpen -I../segment/ -I./
projectlibdir = $(libdir)
projectlib_PROGRAMS = libmanage.so
libmanage_so_SOURCES = processManage.cpp  processManage.h
libmanage_so_LDFLAGS = -shared -fpic #GCC編譯動態庫的選項
libmanage_so_LDADD= -L../smooth/ -L../sharpen/ -L../segment/ -lsmooth -lsharpen -lsegment  #依賴的庫
最後是sample中可執行檔案的Makefile.am,具體如下:
AUTOMAKE_OPTIONS = foreign
INCLUDES=`pkg-config opencv --cflags` -I../src/processManage/ -I../src/smooth/ -I../src/sharpen/ -I../src/segment/ -I. 
bin_PROGRAMS = segment
segment_SOURCES = segment.cpp
LIBS = `pkg-config opencv --libs` 
segment_LDADD =-L../src/smooth/ -L../src/sharpen/ -L../src/segment/ -L../src/processManage/  -lsmooth -lsharpen -lsegment -lmanage   
注意事項:由於GCC中依賴的動態庫必須放在-o引數的後面,所以`pkg-config opencv --libs`必須放到LIBS變數中,因為檢視後面生成的Makefile可以看到,_LDADD和_LIBS在-o的後面,而_LDFLAGS在-o的前面,而`pkg-config opencv --libs`不能放到_LDADD中
6.2:如果使用libtool生成動態庫,可以使用libtool生成可移植性的動態庫,生成的動態庫為.lo檔案,它會呼叫自己目錄下子目錄./libs/中的.so檔案,使用.lo檔案和使用.so檔案的方法類似,只是需要使用-lz引數,模版如下(下面用一個簡單的專案舉例):
AUTOMAKE_OPTIONS=foreign
lib_LTLIBRARIES=libhello.la   #要生成的動態庫的名字
libhello_la_SOURCES=test.cpp #依靠的原始檔和標頭檔案,使用空格分開
此時的可執行檔案,模版如下:
AUTOMAKE_OPTIONS=foreign
INCLUDES= -I../include     #依賴的標頭檔案目錄
bin_PROGRAMS=hello    
hello_SOURCES=hello.cpp
hello_LDADD= -L../lib/ -lz ../lib/test.lo  #依賴的庫檔案
7、如果要生成.lo動態庫,則libtoolize --automake --copy --force

8、touch NEWS README AUTHORS ChangeLog

9、執行automake --add-missing命令生成Makefile.in檔案

10、執行./configure 命令生成Makefile檔案

11、執行make && make install





相關推薦

automake編寫完整專案---動態+執行檔案

上一篇部落格automake簡介中簡單的介紹了automake的使用流程,但是真正的專案肯定是很複雜的,包含不同的目錄,有的生成動態庫,有的是可執行檔案,本文就用一個簡單的opencv專案來介紹一下automake在大型專案的使用方法。本文中,最外層包含兩個目錄,一個目錄是

cmake編譯靜態/動態/執行檔案及測試demo

0.編譯 # cd build # cmake .. # make -j4 //test.c測試demo #include <stdio.h>  int main(){   HelloFu

META-INF的編寫。eclipse打包jar執行檔案

在打包我們的java工程檔案到一個.jar檔案的時候,有時候我們的工程檔案會引用別的lib這時候在打包的時候就需要我們自己來將這些類也打包進來,具體 的做法是: 1.先在工程檔案的根目錄下新建一個 lib 資料夾,將需要呼叫的一些檔案.jar檔案放到裡面。 2. 新建一個

VS程式設計,x86,x64,Any CPU在執行檔案(EXE)或dll(動態連結)的區別:

Any CPU和x86的可執行檔案(EXE)或dll(動態連結庫)在32位和64位下的區別: 1、x86平臺編譯出來的exe(可執行檔案)或dll(動態連結庫)都是32位的 2、x64平臺編譯出來的exe(可執行檔案)或dll(動態連結庫)對應的則是64位的。 3、Any

Linux下檢視執行檔案動態的ELF頭等資訊

      用法: readelf <option(s)> elf-file(s)       作用: 和Windows下的PE檔案類似,ELF檔案是linux系統下可執行檔案、動態庫檔案、靜態庫檔案的標準格式。有時候我們需要檢視ELF檔案的頭資訊,或者動態庫檔

ndk生成elf執行檔案動態檔案

    Eclipse中安裝好adt外掛後,就可以通過Eclipse開發Android工程,然後網上下載一個ndk包並解壓,然後在Eclipse中填好ndk目錄,之後便可以使用ndk。ndk最主要的功能是為了實現Android 的jni,除此功能外還可通過ndk生成elf可執行檔

【C語言】【unix c】如何察看執行檔案依賴哪些動態

5、如何察看可執行檔案依賴哪些動態庫: 【ldd 可執行檔案的名字】:列印程式或庫檔案所依賴的共享庫列表 舉例: tarena@ubuntu:~/day/day24$

【PE】Windows平臺下為執行檔案動態dll新增版本資訊

###Date: 2017/9/22 ###Author : SoaringLee   平常我們可以看到在Windows可執行檔案中,右鍵屬性中含有檔案版本,檔名稱和版本等資訊,本文講述怎麼新增這些

用工具軟體dumpbin.exe檢視執行檔案動態依賴項

就可以看到以下的資訊:Microsoft (R) COFF/PE Dumper Version 12.00.21005.1 Copyright (C) Microsoft Corporation. All rights reserved. Dump of file your-file.dll File

IntelliJ IDEA 把java專案匯出成執行的jar

1.開啟IntelliJ IDEA 的Project structure 2.Project structure的相關配置 3.選中  Artifacts>JAP>From modules with dependencies 4.選擇1個有main方法的類做為啟動類,然

在一個Android專案裡面有兩個執行檔案,如何實現呼叫方式

我的處理方式是: 用Intent+AndroidManifest.xml的方法: 此方法是用Intent和修改AndroidManifest.xml達成的。 就是在要引用的AndroidManifest.xml檔案裡面加入被引用那個專案的activity: <activity

Springboot中引入本地jar包,並通過maven把專案打成執行jar包

       最近把以往的老專案用SpringBoot進行了重構,老專案中有部分本地依賴包不是放在maven庫裡的,是本地開發直接引入,需要在mvn package的時候把本地依賴jar也打進可執行包中。 這種通用問題,在網上找了一圈卻沒發現什麼好的解決辦

徹底理解連結器:執行檔案

庫與可執行檔案 在連結器可操作的元素這一節中我們提到,連結器可以操作的最小單元為目標檔案,也就是說我們見到的無論是靜態庫、動態庫、可執行檔案,都是基於目標檔案構建出來的。目標檔案就好比樂高積木中最小的零部件。 給定目標檔案以及連結選項,連結器可以生成兩種庫,分別是靜

Java_Java專案如何生成執行jar包、exe檔案

功能:為大家淺談如何通過eclipse將Java專案生成可執行jar包,以及如何通過exe4j把jar包弄成ext檔案; =》Java專案 1、Java專案生成jar包 (1)、“專案”右鍵->"Export..."匯出,彈出“匯出設定”視窗如下:

連結裝載與 第6章 執行檔案的裝載與程序

可執行檔案的裝載與程序 在第一章中講到,程式直接使用實體記憶體地址有以下缺點: 地址空間不隔離。惡意程式可以很容易的改寫其他程式的資料。 記憶體使用效率低。一個程式需要執行時,需要將整個程式裝入記憶體之中。 程式執行地址的不確定。因為無法保證每次都將程式載入到相同

java專案到處jar包,轉成.exe執行檔案

需要使用的工具: eclipse,exe4j,iocFx2(製作ico圖示) 具體轉換步驟分為兩步: 一、將java專案到處成jar包; 二、將匯出的jar包轉換成exe可執行檔案; 步驟一:將jav

微信小程式 新建專案並配置執行檔案目錄

新建專案 下載微信小程式開發者客戶端並開啟,選擇專案目錄和專案名稱,填入AppID,取消勾選快速啟動模板。 1. 新建全域性配置檔案 點選目錄左上角的+,新建字尾名為js, json, wxss(命名自定,如app.js)檔案,用

用arm-eabi-objdump命令檢視lib執行檔案的函式-地址對映資訊

source build/envsetup.shchoosecombo arm-eabi-objdump -d out/target/product/generic/system/bin/mediaserver >mediaserver.addr 將mediaser

java專案匯出為執行jar包

工程名下單擊右鍵——export——java——runnable JAR file——browse設定路徑——finish 1.在eclipse左側的package explorer中找到要匯出的工程,此處以Test工程為例 2.單擊右鍵在出現的下拉選單中選擇expor

將Maven專案打包成執行jar檔案和外種配置方式(引用第三方jar)

http://blog.csdn.net/zhangdaiscott/article/details/6911640 方法一. mvn assembly 或 mvn package (一個jar包) 把依賴包和自己專案的檔案打包如同一個jar包(這種方式對sp