如何使用libtool创建二进制文件和.so

pm1*_*100 9 c++ automake autoconf gcc 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)
Run Code Online (Sandbox Code Playgroud)

当我运行它时,cpp文件被编译两次,一次使用libtool,一次没有,有时libtool/automake抱怨

Makefile.am: object `f1.$(OBJEXT)' created both with libtool and without`
Run Code Online (Sandbox Code Playgroud)

我尝试将COMMON_SOURCES放入.a文件中,但是当我将.a与.la链接时,libtool会抱怨(说它不可移植).

我需要的是类似的东西

bin_LTPROGRAMS=mybin
Run Code Online (Sandbox Code Playgroud)

但那并不存在

编辑:澄清 - 我正在使用automake/autoconf.我上面展示的是我的automake Makefile.am的内容

Jac*_*lly 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
Run Code Online (Sandbox Code Playgroud)

如果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
Run Code Online (Sandbox Code Playgroud)

这会将f1.cpp, f2.cpp, f3.cpp, f4.cpp, f5.cppand链接f6.cpplibmylib.laand main.cpp, f1.cpp, f2.cppand f3.cppinto mybin


Dan*_*ien 3

问题在于,将公共源制作成共享对象时与制作成静态档案时需要进行不同的编译;例如,在前者的情况下,g++需要传递标志-fPIC

我建议使用两个构建目录。

假设这个源层次结构:

./src/Makefile.am
./src/f1.cpp
./src/f2.cpp
./src/f3.cpp
./src/main.cpp
./配置.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
Run Code Online (Sandbox Code Playgroud)

并在./ReleaseDisableShared你运行:

../configure --disable-shared && make
Run Code Online (Sandbox Code Playgroud)

在每个构建目录中构建后,您可以使用mybinat./ReleaseDisableShared/src/mybinlibmylib.soat ./Release/src/libmylib.so

也可以看看: