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 导出声明非常普遍需要的东西。
我的项目使用 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 导出声明非常普遍需要的东西。