3

私のプロジェクトでは、モジュールは整理のためにサブディレクトリに編成されています。

私のプロジェクトのディレクトリ階層:

$ ls -R
.:         configure.in Makefile.am  Makefile.cvs  src
./src:     log          Makefile.am  main.cpp
./src/log: log.cpp      Makefile.am

configure.in:

AC_INIT(configure.in)
AM_CONFIG_HEADER(config.h)
AM_INIT_AUTOMAKE(myapp, 0.1)
AC_LANG_CPLUSPLUS
AC_PROG_CXX
AM_PROG_LIBTOOL
AC_OUTPUT(Makefile src/Makefile src/log/Makefile)

Makefile.am:

AUTOMAKE_OPTIONS = foreign
SUBDIRS = src

Makefile.cvs:

default:
    aclocal
    libtoolize --force --copy
    autoheader
    automake --add-missing --copy
    autoconf

src/Makefile.am

bin_PROGRAMS = myapp
myapp_SOURCES = main.cpp
SUBDIRS = log
myapp_LDADD = $(top_builddir)/src/log/liblog.la

ソース/ログ/Makefile.am:

INCLUDES = $(all_includes)
METASOURCES = AUTO
noinst_LTLIBRARIES = liblog.la
liblog_la_SOURCES = log.cpp

src/main.cpp:を含みint main(){}src/log/log.cpp を含みますvoid f(){}

呼び出すとmake生成されます(簡潔にするために編集されています):

libtool --mode=compile g++     -MT log.lo -MD -MP -MF .deps/log.Tpo -c -o log.lo log.cpp
libtool: compile:  g++ -MT log.lo -MD -MP -MF .deps/log.Tpo -c log.cpp  -fPIC -DPIC -o .libs/log.o
libtool: compile:  g++ -MT log.lo -MD -MP -MF .deps/log.Tpo -c log.cpp -o log.o >/dev/null 2>&1
mv -f .deps/log.Tpo .deps/log.Plo
libtool --mode=link g++    -o liblog.la  log.lo  
libtool: link: ar cru .libs/liblog.a .libs/log.o 
libtool: link: ranlib .libs/liblog.a
libtool: link: ( cd ".libs" && rm -f "liblog.la" && ln -s "../liblog.la" "liblog.la" )
g++ -MT main.o -MD -MP -MF .deps/main.Tpo -c -o main.o main.cpp
mv -f .deps/main.Tpo .deps/main.Po
libtool --mode=link g++    -o myapp main.o ../src/log/liblog.la 
libtool: link: g++ -o myapp main.o  ../src/log/.libs/liblog.a

問題は最初の 3 行です。log.cpp が 2 回コンパイルされています。

質問:半分の時間でコンパイルできるのはなぜですか?

注:自分が何をしているのかわかりません。autotools は私にとって黒魔術ですが、代わりに使用する必要があります。ドキュメントは私には理解できません。

4

1 に答える 1

3

デフォルトでは、Libtool は静的ライブラリと共有ライブラリの 2 種類のライブラリを作成します。(別名 libfoo.a および libfoo.so)

静的およびシャードには、異なるコンパイル フラグが必要です。動的ライブラリ -- 共有オブジェクトは、次の gcc フラグを使用して位置独立コードを使用します。

-fPIC -DPIC

静的ではありません。指定することにより、1つのタイプのみを強制的に構築できます

./configure --disable-shared

また

./configure --disable-static

根拠

通常、ライブラリがユーザーに提供される場合、2 つのセットアップで提供されます。純粋な静的ビルドを作成できる開発用の静的と、このライブラリを使用するほとんどのプログラムで使用するための動的です。そのため、通常、システムにライブラリをインストールするときは、共有オブジェクトのみをインストールします。(別名 libfoo_XYZ.deb)

開発バージョン (別名 libfoo-dev_XYZ.deb) を追加すると、ヘッダーが追加され、必要に応じてユーザーが静的ビルドを作成できるライブラリのバージョンが静的にビルドされます。

これは、UNIX でライブラリを出荷する場合の一般的な方法です。したがって、libtool はこれを自動的に行います。

于 2009-02-21T10:41:06.433 に答える