gpt4 book ai didi

autotools - Libtool 缓慢,双重构建?

转载 作者:行者123 更新时间:2023-12-03 08:07:53 28 4
gpt4 key购买 nike

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

我的项目目录层次结构:

$ ls -R
.: configure.in Makefile.am Makefile.cvs src
./src: log Makefile.am main.cpp
./src/log: log.cpp Makefile.am

配置.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

生成文件.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 对我来说是黑魔法,但我们必须在我们的地方使用它。我无法理解这些文档。

最佳答案

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

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

-fPIC -DPIC

静态不是。您可以通过指定

强制只构建一种类型
./configure --disable-shared

./configure --disable-static

基本原理

通常,当为用户提供库时,它会提供两种设置——允许创建纯静态构建的静态开发和供大多数人使用的动态使用这个库的程序。所以,通常当你在系统中安装库时您只安装共享对象。 (又名 libfoo_XYZ.deb)

当您添加开发版本(又名 libfoo-dev_XYZ.deb)时,您会添加 header 和静态允许用户根据需要进行静态构建的库的构建版本。

这是在 UNIX 中发布库的常见做法。因此 libtool 这样做是为了你自动。

关于autotools - Libtool 缓慢,双重构建?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/572760/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com