Makefile.am 如何知道它是否配置为使用 libtool 构建共享库

How to know whether it's configured to build shared library with libtool in Makefile.am

我的项目使用 autotools 并包含一个库和一个使用该库的程序。我想知道它是否配置为构建共享库以相应地更改程序的编译选项。 Makefile.am 应该是这样的:

if BUILDING_SHARED_LIBRARY
my_program_CFLAGS += -DBUILDING_SHARED_LIBRARY
endif

我怎样才能做到这一点?

我看过源代码,发现 Makefile.am 没有接口。 configure 会直接将配置写到 libtool 而不会暴露给 automake。

所以:

AM_CONDITIONAL([BUILDING_SHARED_LIBRARY], [test "x$enable_shared" = xyes])

configure.ac 中不起作用? libtool 会自动设置一些编译器标志来构建共享库。

我找到的最佳解决方案基于 ldav1s 的答案,如下所示:

if BUILDING_SHARED_LIBRARY
%.lo: AM_CXXFLAGS += -DBUILDING_SHARED_LIBRARY
%.o: AM_CXXFLAGS += -DUSING_SHARED_LIBRARY
else
%.lo: AM_CXXFLAGS += -DBUILDING_STATIC_LIBRARY
%.o: AM_CXXFLAGS += -DUSING_STATIC_LIBRARY
endif

这是 GNU Make-specific,当然,我看不出有任何其他方法可以做到这一点。请注意,Brett Hale 在评论中提出的使用 #ifdef PIC 的解决方案至少在为 MSW 进行(交叉)编译时不起作用,其中从未定义此符号。

libtool 不允许为构建静态对象和共享对象定义单独的标志,这很奇怪,例如在 LT_INIT() 中,因为这看起来像是使用正确的 ELF visibility/Windows DLL 导出声明非常普遍需要的东西。