我的项目使用autotools并包含一个库和一个使用该库的程序。我想知道它是否配置为构建共享库以相应地更改程序的编译选项。 Makefile.am应该是这样的:
if BUILDING_SHARED_LIBRARY
my_program_CFLAGS += -DBUILDING_SHARED_LIBRARY
endif
我怎样才能做到这一点?
答案 0 :(得分:2)
所以:
configure.ac
在libtool
中不起作用? a.each_index.map { |i| a[i]+b[i] }
# => [1, 5, 7, 7, 7]
将自行设置一些用于构建共享库的编译器标志。
答案 1 :(得分:1)
我已阅读源代码,发现Makefile.am
没有界面。 configure
将直接将配置写入libtool
,并且不会向automake公开。
答案 2 :(得分: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导出声明所非常需要的东西。