10

バイナリに直接コンパイルし、共有ライブラリにもコンパイルしたい 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 ファイルが 2 回コンパイルされます。1 回は libtool を使用し、もう 1 回は使用せずに、libtool/automake が不平を言うことがあります。

Makefile.am: object `f1.$(OBJEXT)' created both with libtool and without`

COMMON_SOURCES を .a ファイルに入れようとしましたが、.a を .la にリンクすると libtool が文句を言います (移植性がないと言っています)。

私が必要とするのは次のようなものです

bin_LTPROGRAMS=mybin

しかし、それは存在しません

編集: 明確化 - 私は automake/autoconf を使用しています。上に示したのは、私の automake Makefile.am の要点です。

4

4 に答える 4

5

具体的には、一般的なソースのライブラリに対するリンク:

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にリンクしてはならないファイルを使用してしまう場合は、次のようなものを使用してlibtool 便利なライブラリmybinを作成します。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.cppf3.cppf4.cppf5.cppおよびf6.cpplibmylib.laおよびmain.cppf1.cppf2.cppおよびにリンクf3.cppされmybinます。

于 2010-09-02T01:56:21.450 に答える
3

問題は、共通ソースを共有オブジェクトにする場合と静的アーカイブにする場合では、異なる方法で共通ソースをコンパイルする必要があることです。たとえば、前者の場合、フラグg++を渡す必要があります。-fPIC

私が提案するのは、2 つのビルド ディレクトリを使用することです。

このソース階層を想定すると、次のようになります。

./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

各ビルド ディレクトリでビルドした後、mybinat./ReleaseDisableShared/src/mybinおよびlibmylib.soatを使用し./Release/src/libmylib.soます。

以下も参照してください。

于 2010-09-03T00:43:30.953 に答える
2

ターゲットにターゲットごとCFLAGS(または同様のもの)が含まれている場合、automakeそのターゲットをビルドするための個別のオブジェクト ファイルが作成されます。mybin次のようなno-op フラグを に追加してみてください。

mybin_CPPFLAGS = -I.

また

mybin_CPPFLAGS = -DDUMMY -UDUMMY
于 2010-09-02T22:19:48.680 に答える
0

競合しないように、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 $@ $<
于 2010-09-01T22:05:58.813 に答える