Libtool:link 项目之一静态生成的库
Libtool: link one of the project generated libs statically
我有一个使用
构建的项目
autoreconf --install
./configure
make
并包含 configure.ac
和 Makefile.am
该项目构建了 2 个库和一个动态 links 它们的可执行文件。一个库是 cpp,另一个库和可执行文件是纯 C。我想静态地 link 库之一(cpp 一个)并动态地保持 c 库到 link。我的简化 Makefile.am
是
ACLOCAL_AMFLAGS = -I m4
SUBDIRS = include doc po
AM_CPPFLAGS = -Iinclude
AM_CPPFLAGS += -D__STRICT_ANSI__
AM_CPPFLAGS += -DNDEBUG
WARNFLAGS = -Wall
AM_CFLAGS = $(WARNFLAGS) $(OPENMP_CXXFLAGS) -std=c11
AM_CXXFLAGS = $(WARNFLAGS) -std=c++11
localedir = $(datadir)/locale
DEFS = -DLOCALEDIR=\"$(localedir)\" @DEFS@
lib_LTLIBRARIES = libmy.la libmy-settings.la
libmy_la_SOURCES = src/sharedlib.c src/sharedlib.h
libmy_settings_la_SOURCES = src/staticlib.cpp src/staticlib.h
bin_PROGRAMS = myapp
myapp_SOURCES = myapp.c
myapp_LDADD = libmy.la libmy-settings.la
libtool 在 ./.libs/
中生成 .a
和 .so
文件,但 Libtool 更喜欢 .so
。在最后一个 make
命令中,我看到 gcc -Wall -std=c11 -g -O2 -o .libs/myapp myapp.o ./.libs/libmy.so ./.libs/libmy-settings.so
。如果我用 gcc -Wall -std=c11 -g -O2 -o .libs/myapp myapp.o ./.libs/libmy.so ./.libs/libmy-settings.a
替换它 - 它会起作用并给我我正在努力实现的目标。问题是:如何在 Makefile.am
?
的帮助下自动实现它
据我所知,我不能只添加 myapp_LDFLAGS=-lmy-settings.a
因为它不会替换共享的 linking 参数,而是添加一个新参数。而且我无法从 lib_LTLIBRARIES
或 myapp_LDADD
中删除 libmy-settings.la
bcs 它不会在 ./.libs/ 中生成 libmy-settings.a 或 libmysettings.so全部。有什么线索吗?
由于 libmy-settings
不需要单独安装的库,您有两个非常直接的选择:
将其来源添加到 myapp_SOURCES
,并将 libmy-settings.la
完全排除在外。额外的源代码位于不同的目录中并以不同的(自动工具支持的)语言编写应该不是问题。就 Autotools 选择正确的链接器驱动程序和选项而言,这种方法也可能对您有利,而无需您的干预。
构建 libmy-settings.la
作为实用程序库而不是可安装的库。这是通过将其标记为 noinst
:
来实现的
lib_LTLIBRARIES = libmy.la
noinst_LTLIBRARIES = libmy-settings.la
我有一个使用
构建的项目autoreconf --install
./configure
make
并包含 configure.ac
和 Makefile.am
该项目构建了 2 个库和一个动态 links 它们的可执行文件。一个库是 cpp,另一个库和可执行文件是纯 C。我想静态地 link 库之一(cpp 一个)并动态地保持 c 库到 link。我的简化 Makefile.am
是
ACLOCAL_AMFLAGS = -I m4
SUBDIRS = include doc po
AM_CPPFLAGS = -Iinclude
AM_CPPFLAGS += -D__STRICT_ANSI__
AM_CPPFLAGS += -DNDEBUG
WARNFLAGS = -Wall
AM_CFLAGS = $(WARNFLAGS) $(OPENMP_CXXFLAGS) -std=c11
AM_CXXFLAGS = $(WARNFLAGS) -std=c++11
localedir = $(datadir)/locale
DEFS = -DLOCALEDIR=\"$(localedir)\" @DEFS@
lib_LTLIBRARIES = libmy.la libmy-settings.la
libmy_la_SOURCES = src/sharedlib.c src/sharedlib.h
libmy_settings_la_SOURCES = src/staticlib.cpp src/staticlib.h
bin_PROGRAMS = myapp
myapp_SOURCES = myapp.c
myapp_LDADD = libmy.la libmy-settings.la
libtool 在 ./.libs/
中生成 .a
和 .so
文件,但 Libtool 更喜欢 .so
。在最后一个 make
命令中,我看到 gcc -Wall -std=c11 -g -O2 -o .libs/myapp myapp.o ./.libs/libmy.so ./.libs/libmy-settings.so
。如果我用 gcc -Wall -std=c11 -g -O2 -o .libs/myapp myapp.o ./.libs/libmy.so ./.libs/libmy-settings.a
替换它 - 它会起作用并给我我正在努力实现的目标。问题是:如何在 Makefile.am
?
据我所知,我不能只添加 myapp_LDFLAGS=-lmy-settings.a
因为它不会替换共享的 linking 参数,而是添加一个新参数。而且我无法从 lib_LTLIBRARIES
或 myapp_LDADD
中删除 libmy-settings.la
bcs 它不会在 ./.libs/ 中生成 libmy-settings.a 或 libmysettings.so全部。有什么线索吗?
由于 libmy-settings
不需要单独安装的库,您有两个非常直接的选择:
将其来源添加到
myapp_SOURCES
,并将libmy-settings.la
完全排除在外。额外的源代码位于不同的目录中并以不同的(自动工具支持的)语言编写应该不是问题。就 Autotools 选择正确的链接器驱动程序和选项而言,这种方法也可能对您有利,而无需您的干预。构建
来实现的libmy-settings.la
作为实用程序库而不是可安装的库。这是通过将其标记为noinst
:lib_LTLIBRARIES = libmy.la noinst_LTLIBRARIES = libmy-settings.la