2016-10-03 29 views
3

我的項目使用autotools幷包含一個庫和一個使用該庫的程序。我想知道它是否配置爲構建共享庫以相應地更改程序的編譯選項。 Makefile.am應該是這樣的:如何知道它是否被配置爲在Makefile.am中使用libtool構建共享庫

if BUILDING_SHARED_LIBRARY 
my_program_CFLAGS += -DBUILDING_SHARED_LIBRARY 
endif 

我該如何做到這一點?

+0

我懷疑*你想要的是一種可移植的方式來檢測源是否被編譯爲靜態或共享通道。像['PIC'](http://www.gnu.org/software/libtool/manual/libtool.html#Creating-object-files)宏一樣? –

回答

1

我已經讀過源代碼,發現沒有Makefile.am的接口。 configure將直接將配置寫入libtool並且它不會暴露給automake。

2

所以:

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

configure.ac工作?它會自行建立一些用於構建共享庫的編譯器標誌。

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製作專用的,當然,我沒有看到任何其他的方式來做到這一點。請注意,Brett Hale在評論中提出的使用#ifdef PIC的解決方案至少在針對MSW進行(交叉)編譯時不起作用,其中此符號從未定義過。

這很奇怪libtool不允許爲構建靜態和共享對象定義單獨的標誌,例如,在LT_INIT()中,因爲這看起來像是使用適當的ELF可見性/ Windows DLL導出聲明非常常見的東西。

相關問題