【问题标题】:Libtool slowness, double building?Libtool 慢,双重构建?
【发布时间】:2009-02-21 10:33:33
【问题描述】:

在我的项目中,为了整洁,模块被组织在子目录中。

我的项目目录层次结构:

$ 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 对我来说是黑魔法,但我们必须在我们的位置使用它。我无法理解这些文档。

【问题讨论】:

    标签: autotools libtool


    【解决方案1】:

    默认情况下,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”
    • 你的Makefile.cvs里的命令一般都去autogen.sh
    • 那里没有任何东西看起来需要自定义autogen.sh,我认为只要运行autoreconf -i 来引导项目,OP 就可以了。此外,要将depcomp 之类的脚本放在视线之外,请将AC_CONFIG_AUX_DIR([auxfiles]) 添加到configure.ac。要隐藏由libtoolize 添加的*.m4 文件,请将AC_CONFIG_MACRO_DIR([m4]) 添加到configure.ac,并将ACLOCAL_AMFLAGS = -I m4 添加到您的顶级Makefile.am。
    猜你喜欢
    • 2014-04-06
    • 2019-03-26
    • 1970-01-01
    • 2014-08-05
    • 1970-01-01
    • 2022-06-13
    • 2015-10-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多