Libtool速度慢,重复构建?

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

src/log/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对我来说就像黑魔法一样,但我们必须在我们的地方使用它。文档对我来说是无法理解的。
1个回答

3

默认情况下,Libtool创建两种类型的库:静态库和共享库(也称为libfoo.a和libfoo.so)。

静态库和共享库需要不同的编译标志。动态库——共享对象使用带有以下gcc标志的位置无关代码:

-fPIC -DPIC

静态文件并非如此。您可以通过指定来强制构建一个类型。

./configure --disable-shared

或者

./configure --disable-static

目的

通常情况下,当为用户提供库时,会提供两种设置--开发静态库用于创建纯静态构建,动态库用于大多数使用此库的程序。因此,通常在系统中安装库时,只会安装共享对象。(也称为libfoo_XYZ.deb)

当添加开发版本(也称为libfoo-dev_XYZ.deb)时,您将添加标头和静态构建版本的库,使用户可以制作静态构建。

这是在UNIX中发布库的常见做法。因此,libtool会自动为您执行此操作。


作为一个附带问题,我的Makefile.cvs好吗?我从其他地方复制了它,因为它让我摆脱了一堆无用的文件,比如“depcomp”或“config.h.in”。 - Iraimbilanja
你的 Makefile.cvs 中的命令通常会转到 autogen.sh。 - Artyom
里面没有什么看起来需要自定义的autogen.sh,我认为OP只需要运行autoreconf -i引导该项目即可。另外,如果要将脚本如depcomp隐藏起来,请在configure.ac中添加AC_CONFIG_AUX_DIR([auxfiles])。如果要隐藏由libtoolize添加的*.m4文件,请在configure.ac中添加AC_CONFIG_MACRO_DIR([m4]),并在顶层的Makefile.am中添加ACLOCAL_AMFLAGS = -I m4 - Jack Kelly

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接