首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >利博的速度慢,双倍的建筑?

利博的速度慢,双倍的建筑?
EN

Stack Overflow用户
提问于 2009-02-21 10:33:33
回答 1查看 975关注 0票数 3

在我的项目中,模块是按照整洁的子元素组织的。

我的项目dir层次结构:

代码语言:javascript
复制
$ ls -R
.:         configure.in Makefile.am  Makefile.cvs  src
./src:     log          Makefile.am  main.cpp
./src/log: log.cpp      Makefile.am

configure.in:

代码语言:javascript
复制
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:

代码语言:javascript
复制
AUTOMAKE_OPTIONS = foreign
SUBDIRS = src

Makefile.cvs:

代码语言:javascript
复制
default:
    aclocal
    libtoolize --force --copy
    autoheader
    automake --add-missing --copy
    autoconf

src/Makefile.am

代码语言:javascript
复制
bin_PROGRAMS = myapp
myapp_SOURCES = main.cpp
SUBDIRS = log
myapp_LDADD = $(top_builddir)/src/log/liblog.la

src/log/Makefile.am:

代码语言:javascript
复制
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生成(为简洁而编辑):

代码语言:javascript
复制
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编译了两次!

问题:为什么不编译一次--花了一半时间?

注意:我不知道我在做什么--自动工具对我来说是黑魔法,但是我们必须用它来代替我。医生对我来说很难理解。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2009-02-21 10:41:06

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

静态和碎片需要不同的编译标志。动态库--共享对象使用独立于位置的代码,并有以下gcc标志:

代码语言:javascript
复制
-fPIC -DPIC

静态不是。通过指定,只能强制生成一种类型。

代码语言:javascript
复制
./configure --disable-shared

代码语言:javascript
复制
./configure --disable-static

基本原理

通常,当为用户提供库时,它提供了两个设置--静态用于开发,允许创建纯静态构建,并允许大多数使用此库的程序使用动态。因此,通常在系统中安装库时,您只安装共享对象。(又名libfoo_XYZ.deb)

当您添加开发版本(又名libfoo_xyz.deb)时,您可以添加标头和静态构建版本的库,允许用户进行静态构建。

这是UNIX中传送库的常见做法。因此libtool自动为您执行此操作。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/572760

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档