我的項目使用autotools幷包含一個庫和一個使用該庫的程序。我想知道它是否配置爲構建共享庫以相應地更改程序的編譯選項。 Makefile.am應該是這樣的:如何知道它是否被配置爲在Makefile.am中使用libtool構建共享庫
if BUILDING_SHARED_LIBRARY
my_program_CFLAGS += -DBUILDING_SHARED_LIBRARY
endif
我該如何做到這一點?
我的項目使用autotools幷包含一個庫和一個使用該庫的程序。我想知道它是否配置爲構建共享庫以相應地更改程序的編譯選項。 Makefile.am應該是這樣的:如何知道它是否被配置爲在Makefile.am中使用libtool構建共享庫
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
工作?它會自行建立一些用於構建共享庫的編譯器標誌。
我找到的最好的解決方案基於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導出聲明非常常見的東西。
我懷疑*你想要的是一種可移植的方式來檢測源是否被編譯爲靜態或共享通道。像['PIC'](http://www.gnu.org/software/libtool/manual/libtool.html#Creating-object-files)宏一樣? –