我有一套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

然后你创建的目录 ReleaseReleaseDisableShared./.在目录 ./Release 你运行:

../configure && make

./ReleaseDisableShared 你运行:

../configure --disable-shared && make

后建设在每个建立目录,可以使用 mybin./ReleaseDisableShared/src/mybinlibmylib.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.cppf2.cppf3.cppf4.cppf5.cppf6.cpplibmylib.lamain.cppf1.cppf2.cppf3.cppmybin

如果一个目标包含按目标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 $@ $<
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top