如何确定Makefile.am中是否已配置使用libtool构建共享库

3

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

if BUILDING_SHARED_LIBRARY
my_program_CFLAGS += -DBUILDING_SHARED_LIBRARY
endif

我该如何实现这个目标?

猜测你想要的是一种便携式的方法来检测源代码是否正在编译为静态或共享通道。就像PIC宏一样? - Brett Hale
3个回答

2
所以:
AM_CONDITIONAL([BUILDING_SHARED_LIBRARY], [test "x$enable_shared" = xyes])

configure.ac中无法运行?libtool会自动为构建共享库设置一些编译器标志。请检查configure.ac文件并确保它正确地调用了libtool

1
我已经阅读了源代码,发现没有Makefile.am的接口。 configure将直接将配置写入libtool,并且不会暴露给automake。

0
我找到的最佳解决方案基于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特有的,我看不出其他方式来做这个。请注意,在Brett Hale评论中提出的解决方案,使用#ifdef PIC,在(交叉)编译MSW时不起作用,因为这个符号从未定义。
很奇怪的是libtool不允许为构建静态和共享对象定义单独的标志,例如在LT_INIT()中,因为这似乎是使用正确的ELF可见性/Windows DLL导出声明非常常见的需求。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接