Libtool:link 项目之一静态生成的库

Libtool: link one of the project generated libs statically

我有一个使用

构建的项目
autoreconf --install
./configure
make

并包含 configure.acMakefile.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_LTLIBRARIESmyapp_LDADD 中删除 libmy-settings.la bcs 它不会在 ./.libs/ 中生成 libmy-settings.a 或 libmysettings.so全部。有什么线索吗?

由于 libmy-settings 不需要单独安装的库,您有两个非常直接的选择:

  1. 将其来源添加到 myapp_SOURCES,并将 libmy-settings.la 完全排除在外。额外的源代码位于不同的目录中并以不同的(自动工具支持的)语言编写应该不是问题。就 Autotools 选择正确的链接器驱动程序和选项而言,这种方法也可能对您有利,而无需您的干预。

  2. 构建 libmy-settings.la 作为实用程序库而不是可安装的库。这是通过将其标记为 noinst:

    来实现的
    lib_LTLIBRARIES = libmy.la
    noinst_LTLIBRARIES = libmy-settings.la