在我的项目,模块在子目录组织为保持整洁。

我的项目目录层次结构:

$ 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.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被编译两次

现在的问题:?为什么不只是一次编译 - 以一半的时间

注意:我不知道我在做什么 - 自动工具是黑魔法我的,但我们有我们的地方使用它。该文档是不可理解的我的。

有帮助吗?

解决方案

默认情况下Libtool程序创建两个类型的库:静态的和共享。 (又名libfoo.a和libfoo.so)

静态和碎片需要不同的编译标志。动态库 - 共享对象 使用位置无关的代码与以下的gcc国旗:

-fPIC -DPIC

静态不是。可以通过specifing迫使构建仅一种类型的

./configure --disable-shared

./configure --disable-static

<强>原理

通常,当提供了一种用于用户库它在两个设置提供 - 静态的发展,其允许创建纯静态建立和动态供最 那使用这个库的程序。因此,通常当你在系统中安装库 你只安装共享对象。 (又名libfoo_XYZ.deb)

当您添加开发版本(又名libfoo的-dev_XYZ.deb)添加页眉和静态 建立一个允许库版本用户做出是否whant staic的基础之上。

这是UNIX中航运库常见的做法。因此libtool的实现这个要求 您自动

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top