Automakeで共有ライブラリ(ダイナミックリンクライブラリ)Makefileを作成する
23289 ワード
Automakeツールパッケージを使用して、クロスコンパイルされた共有ライブラリのMakefileを作成するには
ここで使用するautoconfは2.67バージョンで、debianの下で実現されています.
バージョンが低い場合は、apt-get install automakeで最新のバージョンをインストールしたり、libtoolが必要になったり、apt-get installでインストールしたりすることができます.
ここでは、簡単な関数ライブラリを作成して説明します.
ディレクトリrx、およびソースディレクトリsrcを作成する:
rx/srcでrx.c,rx.hの2つのソースファイルを編集します.
rxディレクトリとrx/srcディレクトリの下でそれぞれMakefile.amファイルを作成する
rxディレクトリの下のMakefile.amは最上位のMakefile.amファイルで、ソースコードが格納されているサブディレクトリが含まれている限り、内容は以下の通りです.
rx/srcディレクトリの下にあるMakefile.amの内容は次のとおりです.
そのうちlib_LTLIBRARIES=の後の「librx.la」は生成するライブラリファイル名で、.laと書く必要があります..soではなく、実際にlibrx.soファイルが生成されます.
次のlibrx_Laはlibrx.laが「.」を下線「」に変換した後に「_SOURCES=」を付け、等号以降はソースファイル名で、1つ以上の場合はスペースで区切ります.
include_HEADERS=後のヘッダファイルは、他のプログラムに含めるために使用され、make install時にインストールディレクトリのincludeディレクトリにコピーされます.
上位ディレクトリに戻り、autoscanを使用してソースディレクトリをスキャンします.
configure.scanをconfigure.acに改名する
このファイルをコンパイルするには:
AC_の変更INITは、パッケージのフルネーム、バージョン番号、BUGレポートのメールアドレスを追加します.
次の文を追加します.
この言葉は必須です.
このスクリプトは共有ライブラリを生成するために使用されるので、AC_を追加します.PROG_LIBTOOL AC_PROG_CCの次の行:
後のAC_を修正CONFIG_FILES文、AC_に変更OUTPUT、そして後ろのAC_をOUTPUT取外し:
これでconfigure.acが作成され、修正された内容は以下の通りです.
次に、次の手順に従います.
このときconfigureスクリプトが生成されます.
Makefileを生成するように構成できます.
ARM CPUにクロスコンパイルされた共有ライブラリを生成する場合、ここで使用するコンパイラがarm-none-linux-gnueabi-gccであり、最終的にARMボードで実行するときに、ライブラリをターゲットボードの/usr/local/armrx 2 dディレクトリにインストールすると仮定します.次のように構成できます.
Makeが完了すると、srcディレクトリの下にある非表示ディレクトリ.libsディレクトリに生成されたライブラリファイルが表示されます.
最上位ディレクトリに戻り、make installを実行すると、生成されたライブラリを/usr/local/armrx 2 d/libディレクトリの下に自動的にインストールできます.
Automakeを使用すると、次のエラーメッセージが表示されます.
required file `./ltmain.sh' not found
libtoolが構成されていないためです.
解決策:
$libtoolize --automake --debug --copy –force
または、
$libtoolize --automake
ここで使用するautoconfは2.67バージョンで、debianの下で実現されています.
バージョンが低い場合は、apt-get install automakeで最新のバージョンをインストールしたり、libtoolが必要になったり、apt-get installでインストールしたりすることができます.
ここでは、簡単な関数ライブラリを作成して説明します.
ディレクトリrx、およびソースディレクトリsrcを作成する:
$
mkdir
rx
$
mkdir
rx
/
src
rx/srcでrx.c,rx.hの2つのソースファイルを編集します.
mybdebian:
/
home
/
myb
/
php
/
rx
/
src
#
cat rx
.
h
#
ifndef __RX_H_
#
define __RX_H_
int fun
();
#
endif
mybdebian:
/
home
/
myb
/
php
/
rx
/
src
#
cat rx
.
c
#
include
"
rx.h
"
int fun
()
{
return
1234
;
}
rxディレクトリとrx/srcディレクトリの下でそれぞれMakefile.amファイルを作成する
rxディレクトリの下のMakefile.amは最上位のMakefile.amファイルで、ソースコードが格納されているサブディレクトリが含まれている限り、内容は以下の通りです.
AUTOMAKE_OPTIONS
=
foreign
SUBDIRS
=
src
rx/srcディレクトリの下にあるMakefile.amの内容は次のとおりです.
AUTOMAKE_OPTIONS
=
foreign
lib_LTLIBRARIES
=
librx.la
librx_la_SOURCES
=
rx.c
include_HEADERS=rx.h
そのうちlib_LTLIBRARIES=の後の「librx.la」は生成するライブラリファイル名で、.laと書く必要があります..soではなく、実際にlibrx.soファイルが生成されます.
次のlibrx_Laはlibrx.laが「.」を下線「」に変換した後に「_SOURCES=」を付け、等号以降はソースファイル名で、1つ以上の場合はスペースで区切ります.
include_HEADERS=後のヘッダファイルは、他のプログラムに含めるために使用され、make install時にインストールディレクトリのincludeディレクトリにコピーされます.
上位ディレクトリに戻り、autoscanを使用してソースディレクトリをスキャンします.
$autoscan
$ls
autoscan.log configure.scan Makefile.am src
configure.scanをconfigure.acに改名する
$mv
configure.scan configure.ac
AC_OUTPUT([Makefile
src
/
Makefile])
このファイルをコンパイルするには:
$
vim configure
.
ac
#
-*- Autoconf -*-
#
Process this file with autoconf to produce a configure script.
AC_PREREQ([
2.67
])
AC_INIT([FULL
-
PACKAGE
-
NAME], [VERSION], [BUG
-
REPORT
-
ADDRESS])
AC_CONFIG_SRCDIR([src
/
rx.c])
AC_CONFIG_HEADERS([config.h])
#
Checks for programs.
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])
AC_OUTPUT
AC_の変更INITは、パッケージのフルネーム、バージョン番号、BUGレポートのメールアドレスを追加します.
AC_INIT(rx2dlib,
0.01
,resound
@
163
.com)
次の文を追加します.
AM_INIT_AUTOMAKE
この言葉は必須です.
このスクリプトは共有ライブラリを生成するために使用されるので、AC_を追加します.PROG_LIBTOOL AC_PROG_CCの次の行:
#
Checks for programs.
AC_PROG_CC
AC_PROG_LIBTOOL
後のAC_を修正CONFIG_FILES文、AC_に変更OUTPUT、そして後ろのAC_をOUTPUT取外し:
AC_OUTPUT([Makefile
src
/
Makefile])
これでconfigure.acが作成され、修正された内容は以下の通りです.
#
-*- Autoconf -*-
#
Process this file with autoconf to produce a configure script.
AC_PREREQ([
2.67
])
AC_INIT(rx2dlib,
0.01
,resound
@
163
.com)
AM_INIT_AUTOMAKE
AC_CONFIG_SRCDIR([src
/
rx.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
src
/
Makefile])
次に、次の手順に従います.
$
aclocal
$
autoconf
$
autoheader
$
libtoolize --automake
$
automake –-add-missing
configure
.
ac:
13
: installing `
./
config
.
guess'
configure
.
ac:
13
: installing `
./
config
.
sub'
configure
.
ac:
6
: installing `
./
install-sh'
configure
.
ac:
6
: installing `
./
missing'
src
/
Makefile
.
am: installing `
./
depcomp'
このときconfigureスクリプトが生成されます.
Makefileを生成するように構成できます.
ARM CPUにクロスコンパイルされた共有ライブラリを生成する場合、ここで使用するコンパイラがarm-none-linux-gnueabi-gccであり、最終的にARMボードで実行するときに、ライブラリをターゲットボードの/usr/local/armrx 2 dディレクトリにインストールすると仮定します.次のように構成できます.
$./
configure --host
=
arm-none-linux-gnueabi --prefix
=/
usr
/
local
/
armrx2d
$make
Makeが完了すると、srcディレクトリの下にある非表示ディレクトリ.libsディレクトリに生成されたライブラリファイルが表示されます.
mybdebian:
/
home
/
myb
/
php
/
rx
/
src
/.
libs
#
ls -l
20
-rw-r--r--
1
root root
2368
04
-
19
22
:
48
librx
.
a
lrwxrwxrwx
1
root root
11
04
-
19
22
:
48
librx
.
la -
>
../
librx
.
la
-rw-r--r--
1
root root
930
04
-
19
22
:
48
librx
.
lai
lrwxrwxrwx
1
root root
14
04
-
19
22
:
48
librx
.
so -
>
librx
.
so
.
0.0
.
0
lrwxrwxrwx
1
root root
14
04
-
19
22
:
48
librx
.
so
.
0
-
>
librx
.
so
.
0.0
.
0
-rwxr-xr-x
1
root root
5422
04
-
19
22
:
48
librx
.
so
.
0.0
.
0
-rw-r--r--
1
root root
2228
04
-
19
22
:
48
rx
.
o
最上位ディレクトリに戻り、make installを実行すると、生成されたライブラリを/usr/local/armrx 2 d/libディレクトリの下に自動的にインストールできます.
Automakeを使用すると、次のエラーメッセージが表示されます.
required file `./ltmain.sh' not found
libtoolが構成されていないためです.
解決策:
$libtoolize --automake --debug --copy –force
または、
$libtoolize --automake