在我的项目中,模块被组织在子目录中以便整洁。
我的项目目录层次结构:
$ 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
的src /数/ 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
问题是前三行: log.cpp被编译两次!
问题:为什么不只是编译一次 - 占用一半的时间?
注意:我不知道我在做什么 - autotools对我来说是黑魔法,但我们必须在我们的地方使用它。这些文档对我来说是不可理解的。
答案 0 :(得分:3)
默认情况下,Libtool会创建两种类型的库:static和shared。 (又名libfoo.a和libfoo.so)
静态和分片需要不同的编译标志。动态库 - 共享对象 使用位置无关代码和以下gcc标志:
-fPIC -DPIC
静态不是。您可以通过指定
强制构建一种类型./configure --disable-shared
或
./configure --disable-static
<强>原理强>
通常当为用户提供库时,它提供两种设置 - 静态开发,允许创建纯静态构建和动态供大多数人使用 使用此库的程序。因此,通常在系统中安装库时 你只安装共享对象。 (又名libfoo_XYZ.deb)
当您添加开发版本(也称为libfoo-dev_XYZ.deb)时,您可以静态添加标题 构建库的版本,允许用户进行staic构建。
这是在UNIX中运送库的常见做法。因此libtool就是这样做的 你自动了。