2014-02-27 48 views
2

我們正在研究一個需要從靜態庫創建共享庫的項目。我們面臨的問題是靜態庫包含循環依賴。以下是我的makefile文件的樣本:解決Android Makefile中的循環依賴問題

LOCAL_PATH := $(call my-dir) 
include $(CLEAR_VARS) 
LOCAL_MODULE := Mylib1 
LOCAL_SRC_FILES := lib/libMylib1.a 
include $(PREBUILT_STATIC_LIBRARY) 

      .... 

      .... 

      .... 

LOCAL_MODULE := DisplayDriver 

LOCAL_SRC_FILES := \ 

      file1.c \ 
      file2.c \ 
      file3.c 

LOCAL_STATIC_LIBRARIES := -Wl,--start-group \ 

         Mylib1 \ 
         Mylib2 \ 
         Mylib3 \ 
         Mylib4 \ 
         -Wl,--end-group 


LOCAL_C_INCLUDES := \ 

      $(LOCAL_PATH)/include \ 
      $(LOCAL_PATH)/examples \ 


LOCAL_CFLAGS := -x c -DHAVE_STDINT -DHAVE_SETENV -DNDEBUG -c 

LOCAL_LDLIBS += -llog 

APP_ABI := armeabi-v7a 

include $(BUILD_SHARED_LIBRARY) 

當我給NDK的建造V = 1,我可以在輸出中,明確輪候冊,看到的 - 啓動組和輪候冊, - 端基將在創建共享庫時從編譯中刪除。那麼有沒有其他的標誌是顯而易見的,我錯過了相同的標誌?

我在Windows 7 64位上使用NDK R9。

+0

* [Android NDK:如何鏈接多個第三方庫](https://stackoverflow.com/questions/13637450/android-ndk-how-to-link-multiple-3rd-party-libraries)*不是嚴格來說是重複的,但[接受的答案](https://stackoverflow.com/a/13668373/192373)也解決了這個問題。 –

回答

2

看起來,在LOCAL_STATIC_LIBRARIES中指定的-Wl,--start-group被忽略。

有一種使用方式,LOCAL_GROUP_STATIC_LIBRARIES可以在鏈接時將靜態庫分組爲-Wl,--start-group-Wl,--end-group

現在(ndk-10c)唯一相關的變量是LOCAL_WHOLE_STATIC_LIBRARIES,它使用鏈接器標記--whole-archive

當幾個靜態庫之間存在循環依賴關係時,這通常很有用。請注意,當用於構建共享庫時,這將強制將整個靜態庫中的所有對象文件添加到最終的二進制文件中。雖然這在生成可執行文件時並不正確。

不完全相同的東西,但可能會解決依賴性問題。

在我的項目中,我創建了一個專門的cpp文件,它明確引用了有問題的符號。

auto i_reference_you = 
{ 
    (void *)MyClass::some_symbol, 
    (void *)some_other_symbol 
}; 

這適用於我,因爲只有幾個符號。這不是什麼優雅的東西,但可以讓我免於與構建系統的戰鬥