문제

내 프로젝트에서 모듈은 정화를 위해 서브 디르로 구성됩니다.

내 프로젝트 DIR 계층 :

$ 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는 나에게 흑 마법이지만, 우리는 그것을 대신 사용해야한다. 문서는 나에게 이해할 수 없습니다.

도움이 되었습니까?

해결책

기본적으로 libtool은 두 가지 유형의 라이브러리를 생성합니다 : 정적과 공유. (일명 libfoo.a 및 libfoo.so)

정적 및 샤드에는 다른 컴파일 플래그가 필요합니다. 동적 라이브러리 - 공유 객체는 다음 GCC 플래그와 함께 위치 독립 코드를 사용합니다.

-fPIC -DPIC

정적은 아닙니다. 지정하여 하나의 유형 만 빌드 할 수 있습니다

./configure --disable-shared

또는

./configure --disable-static

이론적 해석

일반적으로 사용자에게 라이브러리가 제공되는 경우 두 가지 설정으로 제공됩니다.이 라이브러리를 사용하는 대부분의 프로그램에서 순수한 정적 빌드와 동적으로 사용하기위한 개발 용 정적입니다. 따라서 일반적으로 시스템에 라이브러리를 설치하면 공유 객체 만 설치합니다. (일명 libfoo_xyz.deb)

개발 버전 (일명 libfoo-dev_xyz.deb)을 추가 할 때 사용자가 STAIC 빌드를 할 수 있도록 헤더와 정적으로 구축 된 라이브러리 버전을 추가합니다.

이것은 UNIX에서 라이브러리 배송에 대한 일반적인 관행입니다. 따라서 libtool은 자동으로이를 수행합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top