如何创建二。因此,使用libtool
题
我有一套cpp文件,我想汇编,直接进入二和也汇编成一个共用图书馆。
我
bin_PROGRAMS=mybin
lib_LTLIBRARIES=libmylib.la
COMMON_SOURCES=f1.cpp f2.cpp f3.cpp
mybin_SOURCES=main.cpp $(COMMON_SOURCES)
libmylib_la_SOURCES=$(COMMON_SOURCES)
当我运行这个cpp文件编译两次,一次与libtool和一次没有及时libtool/automake抱怨
Makefile.am: object `f1.$(OBJEXT)' created both with libtool and without`
我试图把COMMON_SOURCES入。一个文件,但随后libtool抱怨当我的链接。一个与。拉(说其不便携式).
我需要的东西喜欢
bin_LTPROGRAMS=mybin
但是,这不存在
编辑:澄清-我使用的automake/autoconf.我有什么上面所示的是肉,我automake Makefile。我
解决方案
问题是,常见的来源需要汇编不同的时候,他们正在进入一个共用目比时,他们正在进入一个静态的档案;在前一种情况下,例如, g++
需要通过了 -fPIC
标志。
我的建议是使用两个建立目录。
假定这一来源的层次:
./src/Makefile.am ./src/f1.cpp ./src/f2.cpp ./src/f3.cpp ./src/main.cpp ./configure.ac ./Makefile.am
你会用这样的东西在 ./src/Makefile.am
:
bin_PROGRAMS = mybin lib_LTLIBRARIES = libmylib.la mybin_SOURCES = main.cpp mybin_LDADD = libmylib.la libmylib_la_SOURCES = f1.cpp f2.cpp f3.cpp
然后你创建的目录 Release
和 ReleaseDisableShared
在 ./
.在目录 ./Release
你运行:
../configure && make
在 ./ReleaseDisableShared
你运行:
../configure --disable-shared && make
后建设在每个建立目录,可以使用 mybin
在 ./ReleaseDisableShared/src/mybin
和 libmylib.so
在 ./Release/src/libmylib.so
.
参见:
其他提示
链接对的常见来源的文库特异性:
bin_PROGRAMS = mybin
lib_LTLIBRARIES = libmylib.la
mybin_SOURCES = main.cpp
mybin_LDADD = libmylib.la
libmylib_la_SOURCES = f1.cpp f2.cpp f3.cpp
如果libmylib.la
端部向上使用不应该被链接到mybin
文件,创建 libtool的便利库时,使用Makefile.am
是这样的:
bin_PROGRAMS = mybin
noinst_LTLIBRARIES = libcommon.la
lib_LTLIBRARIES = libmylib.la
mybin_SOURCES = main.cpp
mybin_LDADD = libcommon.la
libmylib_la_SOURCES = f4.cpp f5.cpp f6.cpp
libmylib_la_LIBADD = libcommon.la
libcommon_la_SOURCES = f1.cpp f2.cpp f3.cpp
此将链接f1.cpp
,f2.cpp
,f3.cpp
,f4.cpp
,f5.cpp
和f6.cpp
成libmylib.la
和main.cpp
,f1.cpp
,f2.cpp
和f3.cpp
成mybin
。
如果一个目标包含按目标CFLAGS
(或类似的),automake
将使单独的对象文件用于构建目标。尝试加入一些无操作标志,以mybin
,是这样的:
mybin_CPPFLAGS = -I.
或
mybin_CPPFLAGS = -DDUMMY -UDUMMY
您必须给与libtool的不同扩展名创建的对象文件,所以他们不冲突。事实上,这些文件包含用于与重定位和非重定位代码二者的目标文件的元信息(这是控制与-fPIC gcc命令行参数)的文本文件。通过创建的libtool真正的文件通常都存储在“的.libs”子目录。基本生成文件看起来像这样:
CC = $(CXX)
LIBTOOL = libtool --quiet
SRC = lib.cpp test.cpp
LIB_SRC = lib.cpp $(SRC)
LIB_OBJ = $(LIB_SRC:.cpp=.lo)
EXE_SRC = exe.cpp $(SRC)
EXE_OBJ = $(EXE_SRC:.cpp=.o)
EXE = test
LIB = libmylib.la
all: $(EXE) $(LIB)
clean:
$(RM) *.o *.lo $(EXE) $(LIB)
$(EXE): $(EXE_OBJ)
$(LIB): $(LIB_OBJ)
$(LIBTOOL) --tag=CXX --mode=link $(LINK.cc) -shared -version-info 1:0 -rpath $(shell readlink -f .) -o $@ $< $(LDLIBS)
%.o: %.cpp
$(COMPILE.cc) -o $@ $<
%.lo: %.cpp
$(LIBTOOL) --mode=compile --tag=CXX $(COMPILE.cc) -o $@ $<