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的内容
专门针对常见资源库的链接:
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.cpp到libmylib.laand main.cpp, f1.cpp, f2.cppand f3.cppinto mybin。
问题在于,将公共源制作成共享对象时与制作成静态档案时需要进行不同的编译;例如,在前者的情况下,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
然后您创建目录Release并ReleaseDisableShared在./. 在您运行的目录中./Release:
../configure && make
Run Code Online (Sandbox Code Playgroud)
并在./ReleaseDisableShared你运行:
../configure --disable-shared && make
Run Code Online (Sandbox Code Playgroud)
在每个构建目录中构建后,您可以使用mybinat./ReleaseDisableShared/src/mybin和libmylib.soat ./Release/src/libmylib.so。
也可以看看: