如何編寫跨平臺的C語言代碼

掃描關(guān)注一起學(xué)嵌入式,一起學(xué)習(xí),一起成長


弱符號

弱符號是指在定義或者聲明一個對象(變量、結(jié)構(gòu)體成員、函數(shù))時,在對象的前面添加?__attribute__((weak))?標(biāo)志所得到的對象符號。

如下所示函數(shù)即為一個弱對象符號 void test_weak_attr(void),或者稱該函數(shù)是弱函數(shù)屬性的、虛函數(shù)。

__attribute__((weak)) void test_weak_attr(void)// 或者使用如下樣式的定義,兩者等效void __attribute__((weak)) test_weak_attr(void){    printf("Weak Func!\r\n");}

弱符號的作用與示例

弱符號是相對于強符號而言的,在定義或者聲明變量、函數(shù)時,未添加?__attribute__((weak))?標(biāo)識的就默認(rèn)為強符號。

如下,最普通的函數(shù)定義,就是定義了一個強符號 void test_strong_ref(void):

void test_weak_attr(void){    printf("this is a strong func\r\n");}


驅(qū)動程序往往需要考慮兼容性,因為要兼任很多廠商的不同型號的設(shè)備。

若驅(qū)動程序中使用強符號定義一些與適配的設(shè)備的特性相關(guān)的功能,則下次適配其他設(shè)備時,該強符號函數(shù)可能需要被修改,以兼容新的設(shè)備。

當(dāng)適配的設(shè)備很多時,頻繁地更改驅(qū)動代碼將破壞驅(qū)動的可維護性。

弱符號的出現(xiàn)可以很好地解決該問題。弱符號的對象具有可以被重定義的功能(即可以被重載)。下面通過測試說明弱符號這種可被重載的特性。

在 test_weak_attr.c 程序中定義如下弱函數(shù):

// test_weak_attr.c#include 
__attribute__((weak)) void test_weak_attr(void){ printf("this is a weak func\r\n");}


在 main.c 中定義如下程序:

// main.cvoid test_weak_attr(void){    printf("this is a strong func\r\n");}
void app_main(void){ printf("init done\r\n");
test_weak_attr();}



編譯運行該 main.c 程序,得到的結(jié)果是什么樣子的呢?

1

this is a strong func

將 main.c 中的 void test_weak_attr(void) 函數(shù)注釋掉,再重新編譯運行程序得到的結(jié)果是:

1

this is a weak func

小結(jié):在使用弱符號函數(shù)時,我們可以重新定義一個同名的強符號函數(shù)來替代它;若沒有重新定義一個強函數(shù)來替換它,就使用弱函數(shù)的實現(xiàn)。

弱函數(shù)就好像是一個可以被替換的“默認(rèn)函數(shù)”。

值得一提的是,舊版本的編譯器還可以使用如下方式的定義(僅聲明無效)將一個對象定義為一個弱對象:

1

2

3

4

__weak void f(void)

{

//code

}

在 linux 的一些代碼中,__weak 其實就是通過?__attribute__((weak))的重命名,兩者等效。

弱引用


弱引用是在聲明一個對象時,通過__attribute__ ((weakref())?定義一個符號的引用關(guān)系。

如下所示即定義 test_weakref() 函數(shù)弱引用 test_weak_ref() 函數(shù)。

1

static void test_weakref(void) __attribute__ ((weakref("test_weak_ref")));

弱引用是相對于強引用而言的。未通過?__attribute__ ((weakref())?的符號和實現(xiàn)代碼之間的關(guān)系是強引用。

如下即為一個強引用函數(shù)。它直接給出了 函數(shù) test_strong_ref(void)?的實現(xiàn)。

1

2

3

4

static void test_strong_ref(void)

{

????printf("this is a strong ref\r\n");

}

在編譯程序的時候,我們可以直接使用 test_strong_ref(void)?而不必?fù)?dān)心編譯不通過。

如果,我沒有時間去實現(xiàn) test_strong_ref(void) ,還想在程序里先使用該函數(shù)那該如何呢?(是的,就是想白嫖,不想實現(xiàn),還想先在程序里使用這個函數(shù))。

這個時候弱引用就派上用場了。可以先將該函數(shù)定義為弱引用插入到代碼中,待后期有時間再慢慢優(yōu)化代碼實現(xiàn)這個函數(shù)完整的功能。下面結(jié)合測試進行說明。

測試代碼1:


static void test_weakref(void) __attribute__ ((weakref("test_weak_ref")));void app_main(void){    printf("init done\r\n");    if (test_weakref) {        test_weakref();    } else {        printf("There is no weakref\r\n");    }}


測試結(jié)果:

There is no weakref

測試代碼2:


void test_weak_ref(void){    printf("this is a weak ref\n");}static void test_weakref(void) __attribute__ ((weakref("test_weak_ref")));void app_main(void){    printf("init done\r\n");    if (test_weakref) {        test_weakref();    } else {        printf("There is no weakref\r\n");    }}



測試結(jié)果:

this is a weak ref

小結(jié):強引用,在未定義該強引用的實現(xiàn)時,編譯會報錯誤:未定義的引用。

弱引用允許定義一個未實現(xiàn)(未實例化)的對象,這在編譯的時候會將該對象處理成 NULL,編譯器并不會報錯。

通過使用弱引用可以實現(xiàn)后期優(yōu)化代碼的功能。而避免改動使用該函數(shù)的地方。使用弱函數(shù)可以實現(xiàn)類似“鉤子(hook)"函數(shù)的功能。

實際上,包括C、python、go 編程語言在內(nèi)的很多語言 都有類似用法,本篇文章敘述的方法同樣適用于這些語言的相關(guān)開發(fā)。

注意:弱引用僅在靜態(tài)編譯中有效,動態(tài)鏈接中可能無效。

總結(jié)

弱符號、弱引用都是增強程序的可維護性的方法。弱符號通過可以被重定義的特性,實現(xiàn)可以被替換實現(xiàn)。

弱引用通過可以暫時使用一個未定義的函數(shù)的功能,實現(xiàn)允許后期再實現(xiàn)該函數(shù)具體功能,而不必?fù)?dān)心編譯不通過。

為了方便理解,我們先預(yù)設(shè)一個應(yīng)用場景:

我們編寫了一個模擬IIC的驅(qū)動,希望它能夠在不同的的平臺運行,目標(biāo)的平臺就設(shè)為 stm32 標(biāo)準(zhǔn)庫,stm32 HAL 庫,stm32 LL 庫,和 RT-Thread Driver 驅(qū)動庫。

或許讀者有疑惑,為什么同樣是 stm32 ,卻分成三個平臺呢?這是因為從跨平臺軟件編寫者的角度看,只要調(diào)用的庫的 API 不一致,就和換一個不同的平臺沒有什么本質(zhì)的差別,如果在代碼中寫死了 API 的調(diào)用,即使是同一個平臺,仍然像多平臺一樣不能運行。

由此可以看出,跨平臺的困難所在,也不是由硬件平臺所導(dǎo)致的,而是由代碼所依賴的 API 的不同導(dǎo)致的。

同一個平臺,如果依賴的 API 不同,代碼就不能跨平臺,同樣地,不同的平臺,如果依賴的 API 相同,也可以跨平臺。

所以歸根結(jié)底,是代碼所依賴的 API 出現(xiàn)了不同,所以下文中所說的“平臺”,實際上對應(yīng)的是一套 API 。

我們繼續(xù)說這個模擬 IIC 的驅(qū)動,模擬 IIC 驅(qū)動是使用 GPIO 的反轉(zhuǎn)來模擬 IIC 協(xié)議,所以依賴了平臺的 GPIO API,如果把調(diào)用 GPIO 的部分寫死,那么換一個平臺,就肯定不能在多個平臺上運行。

解決方案

下面我們開始討論在多平臺運行的解決方案。

我們先從最樸素簡單的解決方案開始,然后逐步迭代到弱函數(shù)的方案,這樣有兩方面好處:

一是從簡單的方案開始,循序漸進地介紹,可以降低閱讀門檻。

二是可以帶讀者親歷一遍方案的演進過程,以及演進動因。

和給直接給結(jié)果相比,注重過程和動因更能夠還原技術(shù)決策的真實過程

因為任何技術(shù)都是從簡單樸素逐步演進而來的,如果直接給出最后的結(jié)果,會產(chǎn)生理解的斷層,即使記住了幾種技術(shù)的優(yōu)劣,在新的場景中,面對更加多樣化的實際問題也會難免乏力。

先從最樸素的方案講起。

方案一、手動控制添加編譯的 .c 文件

樸素的方案有很多,比如就是多搞幾個版本的 .c 文件,比如SIMU_IIC_STM32_HAL.c ,SIMU_IIC_STM32_LL.c, SIMU_IIC_RTT.c 需要哪個就添加哪個進去編譯不就完了嘛!

這種樸素的方案雖然看起來簡單,但是,這幾個文件中包含有共用的邏輯,例如模擬 IIC 的協(xié)議的實現(xiàn),如何將 8bit 的數(shù)據(jù)依次發(fā)送,等等。

這些共用的邏輯,相當(dāng)于在每個文件中都復(fù)制了一份,一旦修改到共用的邏輯,就要手動同步每個文件,這會導(dǎo)致代碼冗余和維護難度的急劇增加,很容易出現(xiàn)人為失誤。如果需要添加更多的平臺支持,就需要再次復(fù)制修改代碼。

另一個問題是,使用不同的編譯工具鏈,添加編譯文件的方式并不一樣,例如,Visual Studio 和 MDK keil 通常是手動添加,而 CMake 通常直接添加目錄或者通過文件后綴進行搜索。

用戶在使用不同的編譯工具時,需要針對編譯工具來分別處理,這也增加了維護的成本。

因此,我們需要尋找更加優(yōu)雅的解決方案。

方案一中最核心的問題,是沒有分離共用的邏輯,和各個平臺的適配接口。

在通常的命名慣例中,共用的邏輯稱為 Common,而各個平臺的適配接口稱為 Port。

在接下來的方案中,我們就會引入 Common 和 Port 分離的設(shè)計思想,Common 和 Port 的分離,使得對共用邏輯的修改和增強直接 “分發(fā)” 到了各個的 Port 中,而增添新的平臺,不需要對 Common 做任何修改。

方案二、條件編譯

一種更加優(yōu)雅的解決方案是使用條件編譯。條件編譯是一種編譯時根據(jù)條件選擇編譯代碼的技術(shù),可以通過編譯器提供的宏定義和預(yù)處理指令來實現(xiàn)。

在我們的模擬 IIC 驅(qū)動中,可以直接編寫 Common 部分,然后 Common 部分通過條件編譯,可以根據(jù)平臺的不同選擇不同的 GPIO Port API。

例如,在 STM32 標(biāo)準(zhǔn)庫中,可以使用 GPIO_SetPinMode 和 GPIO_WritePin 接口來模擬 IIC 協(xié)議,而在 STM32 HAL 庫中,可以使用 HAL_GPIO_WritePin 和 HAL_GPIO_ReadPin 接口來模擬 IIC 協(xié)議。

因此,在代碼中可以使用如下的條件編譯方式:

#if defined (USE_STM32_STD_LIB)    /* STM32 Standard Peripheral Library */    GPIO_SetPinMode(SDA_PORT, SDA_PIN, GPIO_MODE_OUTPUT_PP);    GPIO_SetPinMode(SCL_PORT, SCL_PIN, GPIO_MODE_OUTPUT_PP);    ...#elif defined (USE_STM32_HAL_LIB)    /* STM32 HAL Library */    HAL_GPIO_WritePin(SDA_PORT, SDA_PIN, GPIO_PIN_SET);    HAL_GPIO_WritePin(SCL_PORT, SCL_PIN, GPIO_PIN_SET);    ...#elif defined (USE_STM32_LL_LIB)    /* STM32 LL Library */    LL_GPIO_SetOutputPin(SDA_PORT, SDA_PIN);    LL_GPIO_SetOutputPin(SCL_PORT, SCL_PIN);    ...#elif defined (USE_RTT_DRIVER)    /* RT-Thread Driver */    rt_pin_mode(SDA_PIN, PIN_MODE_OUTPUT);    rt_pin_mode(SCL_PIN, PIN_MODE_OUTPUT);    ...#endif


這樣,在編譯代碼時,我們可以通過宏定義來選擇編譯使用哪個平臺的代碼,

從而實現(xiàn)跨平臺運行。

然而,這種條件編譯方式還是有一些問題,如果我們需要添加新的平臺支持,就需要添加新的宏定義和條件編譯,而且需要修改模塊的源碼。

方案三 函數(shù)指針

我們可以進一步分離 Common 和 Port,將其放在不同的 .c 文件中,Common 通過函數(shù)調(diào)用的方式來訪問 Port 提供的接口,這樣可以更加靈活和方便地添加新的平臺支持。

具體實現(xiàn)可以通過在 Common 中定義一些函數(shù)指針類型來實現(xiàn)。

例如,我們可以定義一個名為 IICOps 的結(jié)構(gòu)體,其中包含了一些指向函數(shù)的指針,這些函數(shù)實現(xiàn)了具體的 IIC 操作。

在 Port 中,我們實現(xiàn)這些函數(shù),并將其指針傳遞給 Common 中的 IICOps 結(jié)構(gòu)體。

這樣,在 Common 中就可以通過調(diào)用這些函數(shù)指針來訪問 Port 提供的接口了。

這種方案的好處是,添加新的平臺支持時,只需要實現(xiàn)相應(yīng)的 Port 函數(shù),并將其指針傳遞給 Common 中的結(jié)構(gòu)體即可,不需要修改 Common 的源碼。

同時,由于 Common 和 Port 分離,不同平臺的適配代碼可以相互獨立,修改一方不會影響到另一方,從而減少了代碼冗余和維護難度。

但是,使用函數(shù)指針有兩個主要的缺點,一是函數(shù)指針本身需要占據(jù)內(nèi)存,增加了內(nèi)存的開銷,二是函數(shù)指針需要在初始化時進行加載。

具體來說,函數(shù)指針的內(nèi)存開銷相對于代碼本身并不大,通常可以忽略不計,但在嵌入式系統(tǒng)中,資源有限,內(nèi)存開銷需要更加注意。

而函數(shù)指針的初始化需要在程序啟動時進行,這也會對程序的啟動時間產(chǎn)生一定的影響。此外,函數(shù)指針的使用可能會導(dǎo)致一定的運行時開銷,需要在程序性能和資源利用方面做出權(quán)衡。

另外,函數(shù)指針的使用需要程序員有一定的技術(shù)水平和經(jīng)驗,需要合理地進行函數(shù)指針的定義、傳遞和調(diào)用等操作,避免出現(xiàn)潛在的錯誤和安全問題。

總的來說,函數(shù)指針是一種比較靈活和方便的方式,可以幫助我們實現(xiàn)代碼的跨平臺支持,但需要在實際應(yīng)用中仔細(xì)考慮其使用場景和影響,做出合理的決策。

方案四、Common 中聲明,Prot 中實現(xiàn)

在這種方案中,我們?nèi)匀粚?Common 和 Port 分離,但是我們不再使用函數(shù)指針來訪問 Port 中的接口,而是將其定義為 extern 聲明,由 Port 來實現(xiàn)具體的函數(shù)。

具體實現(xiàn)可以通過在 Common 中定義一些 extern 聲明的函數(shù),這些函數(shù)實現(xiàn)了具體的 IIC 操作,但是并不在 Common 中實現(xiàn)具體的代碼邏輯,而是在 Port 中實現(xiàn)。

在 Port 中,我們實現(xiàn)這些函數(shù),并將其聲明為 extern,然后在編譯時鏈接到 Common 中。

這樣,在 Common 中就可以通過調(diào)用這些函數(shù)來訪問 Port 提供的接口了。

這種方案的好處是,添加新的平臺支持時,只需要實現(xiàn)相應(yīng)的 Port 函數(shù),并在編譯時鏈接到 Common 中即可,不需要修改 Common 的源碼。

這樣 Port 的實現(xiàn)函數(shù)的掛載就提前到了編譯階段,避免了運行時掛載函數(shù)指針的復(fù)雜性和容易出錯問題。以及避免了函數(shù)指針的內(nèi)存占用。

但是,和 IIC 的例子不同的是,在一些更實際的項目中,隨著軟件復(fù)雜度的提升, Common 中使用的 Port 函數(shù)數(shù)量會快速膨脹,這時,每個 Port 函數(shù)都必須要實現(xiàn),即使這個功能非常的冷門,這樣 Common 中每增加一個 Port 的依賴,都要求所有的 Port 進行及時的跟進,否則整個項目都無法編譯通過。

接下來,就要有請 weak (弱函數(shù))機制出馬了

但方案四的缺點在于,在一些更實際的項目中,隨著軟件復(fù)雜度的提升,Common 中使用的 Port 函數(shù)數(shù)量會快速膨脹,這時,每個 Port 函數(shù)都必須要實現(xiàn),即使這個功能非常的冷門,這樣 Common 中每增加一個 Port 的依賴,都要求所有的 Port 進行及時的跟進,否則整個項目都無法編譯通過。

方案五 弱函數(shù)

為了解決這個問題,可以使用 weak (弱函數(shù))機制,將所有的 Port 函數(shù)都定義為 weak 函數(shù)。

weak 函數(shù)是一種特殊的函數(shù)類型,帶 weak 的函數(shù)和不帶 weak 的函數(shù)可以同時存在,如果有不帶 weak 的函數(shù),就會優(yōu)先鏈接不帶 weak 的實現(xiàn),如果沒有找到不帶 weak 的實現(xiàn)函數(shù),就會使用 weak 函數(shù)作為默認(rèn)的實現(xiàn)。

即,在使用弱函數(shù)時,如果找到多個實現(xiàn),鏈接器會選擇優(yōu)先級最高的實現(xiàn)。

在 C 語言中,可以使用 attribute((weak)) 來聲明一個函數(shù)為弱函數(shù)。例如:

attribute((weak)) void port_func(){    // 默認(rèn)實現(xiàn)}attribute((weak)) void port_func()


而在 Port 中,只需要實現(xiàn)需要的函數(shù)即可,如果某些函數(shù)不需要實現(xiàn),可以不用管它,因為在鏈接時會使用 Common 中的默認(rèn)實現(xiàn)。

這樣在編譯時如果沒有找到相應(yīng)的實現(xiàn)函數(shù),就會使用默認(rèn)的實現(xiàn),而不會導(dǎo)致編譯錯誤。

而在 Port 中,只需要實現(xiàn)需要的函數(shù)即可,如果某些函數(shù)不需要實現(xiàn),可以不用管它,因為在編譯時會使用 Common 中的默認(rèn)實現(xiàn)。

這樣,在添加新的平臺支持時,只需要實現(xiàn)需要的函數(shù),而不用實現(xiàn)所有的函數(shù),大大簡化了開發(fā)的難度和工作量。同時,也避免了函數(shù)指針的內(nèi)存占用和運行時掛載函數(shù)指針的復(fù)雜性和容易出錯問題。

弱函數(shù)的多編譯器支持

在不同的平臺上, weak 的聲明方法也會有所不同,因此需要自己定義一個 weak 聲明,例如 MY_WEAK,來支持不同的平臺:

/* Compiler */#if defined(__ARMCC_VERSION) && (__ARMCC_VERSION >= 5000000) /* ARM Compiler \                                                              */#define MY_WEAK __attribute__((weak))#elif defined(__IAR_SYSTEMS_ICC__) /* for IAR Compiler */#define MY_WEAK __weak#elif defined(__MINGW32__) /* MINGW32 Compiler */#define MY_WEAK#elif defined(__GNUC__) /* GNU GCC Compiler */#define MY_WEAK __attribute__((weak))#endif/* default MY_WEAK */#ifndef MY_WEAK#define MY_WEAK#endif


可以看到,在不同的編譯器下,weak 有不同的寫法,上面的這些定義包含了對 armcc5、 armclang、IAR、GCC 的支持。

然而,弱函數(shù)的方案在一些平臺有一些明顯的缺陷,例如,MSVC編譯器是微軟公司開發(fā)的C/C++編譯器,在Windows操作系統(tǒng)下被廣泛使用。與GCC和Clang等主流編譯器相比,MSVC對于弱函數(shù)的支持不太完善。

MSVC 中,可以通過使用#pragma weak來聲明弱函數(shù),但是這個特性只能在 x86 和 x64 平臺下使用,而在 ARM 平臺下是不支持的。

此外,在一些版本的MSVC編譯器中,#pragma weak 的功能也存在一些限制和bug,所以一般在 MSVC 中直接取消 weak 還會更實際一些。

用弱函數(shù)對 Port 進行分類

weak 的引入使得我們的 Port 可以根據(jù)實際的需求進行劃分,而不是一股腦地必須實現(xiàn)所有的 Port 函數(shù)。

引入了 weak 之后,我們就有條件將 Port 劃分為以下的幾種:

1.核心且無默認(rèn)實現(xiàn)的 Port

這屬于必須實現(xiàn)的 Port,缺乏這個 Port,模塊的核心功能就運行不起來。例如模擬 IIC中對 IO 的操作 Port 函數(shù),這種 Port 用不用 weak 的區(qū)別不大,屬于最硬的骨頭,在設(shè)計軟件時應(yīng)當(dāng)注意盡可能地減少這種 Port。

在設(shè)計軟件時,可以直接取消這類 Port 的弱定義,讓編譯器在編譯時就拋出錯誤。既然缺少了這類 Port 系統(tǒng)的核心功能就無法工作,那么編譯通過了也沒有什么意義。

2. 核心且有默認(rèn)實現(xiàn)的 Port

這類 Port 可以直接定義一個默認(rèn)實現(xiàn),在大多數(shù)情況下,用戶就可以不用管這個 Port 了,而在有定制需求的場合下,又可以靈活地定制。

例如弱定義一個 port_printf 用來支持跨平臺軟件的打印輸出,默認(rèn)是直接使用平臺的 vprintf,對于大多數(shù)的用戶來說,只需要打印到平臺自帶的 printf 即可,因此對于大多數(shù)用戶來說,這個 Port 不用實現(xiàn),就能正常使用系統(tǒng)了。

attribute((weak)) void port_printf(char* fmt, ...) {  va_list args;  va_start(args, fmt);  vprintf(fmt, args);  va_end(args);}


而有定制需求的用戶可以通過自己重寫 port_printf() 來打印到其他的地方(比如輸出到 log,或者輸出到其他串口)。

在 printf 的例子中,我們默認(rèn)了 printf 是所有的平臺都提供了的,對 printf 進行這種假設(shè)是合理的,因為它是 libc 的標(biāo)準(zhǔn)函數(shù)。

然而,有些 Port 雖然有默認(rèn)實現(xiàn),卻不能支持所有的平臺,例如線程操作的 Port,在常見的平臺中,如 linux、RT-Thread、FreeRTOS ,我們知道如何寫默認(rèn)實現(xiàn),但是這些實現(xiàn)又不通用,這時我們可以在默認(rèn)實現(xiàn)中結(jié)合條件編譯,為常見的平臺提供默認(rèn)實現(xiàn),例如:

attribute((weak)) void port_thread_start(port_thread_t* thread) {#ifdef __linux    pthread_mutex_lock(&(thread->mutex));    pthread_cond_signal(&(thread->cond));    pthread_mutex_unlock(&(thread->mutex));#elif USE_FREERTOS    vTaskResume(thread->thread);#else    #error "port_thread_start() 需要用戶實現(xiàn)"#endif}


這個例子中為 linux 和 FreeRTOS 提供了默認(rèn)的線程啟動 Port 的實現(xiàn),使用 linux 或者 FreeRTOS 的用戶可以通過條件編譯來直接使用默認(rèn)實現(xiàn)。

而既不用 linux 也不用 FreeRTOS 的用戶,則會在編譯時遇到 #error,這提示他們要自己實現(xiàn) port_thread_start()。

這種寫法還有一種好處,就是在不支持 weak 的平臺,例如 MSVC,就可以通過 _WIN32 條件編譯來進行跨平臺支持。

3. 邊緣但無默認(rèn)實現(xiàn)的 Port

還有一類 Port,它們比較冷門,只有部分用戶會使用到,但是又難以提供默認(rèn)的實現(xiàn)。例如用 port_reboot() 來重啟硬件,每個硬件平臺重啟硬件的 API 都是不同的,我們無法提供一個默認(rèn)的實現(xiàn)。

但是,沒有這個 Port,也不影響系統(tǒng)的核心功能,只是在某些時候(例如開啟了超時自動重啟功能),又有這個 Port才行,這樣的 Port 就屬于是邊緣但無默認(rèn)實現(xiàn)的 Port。

這時,就可以選擇將 Port 缺失的錯誤延后到運行時,具體在操作時,就可以編寫一個 weak 的實現(xiàn),而這個實現(xiàn)中拋出一個運行時錯誤,例如:

attribute((weak)) void port_reboot(void){    printf("Error: port_reboot() 需要用戶實現(xiàn)\r\n");    while(1);}


這樣,只要不用到這個 Port,都可以編譯通過且順利運行,只有實際用到時,才會在運行時報錯。

weak 在 GCC 鏈接靜態(tài)庫時的問題

這里我想特別提示一種常見的 weak 失效的問題,這種問題目前我只發(fā)現(xiàn)在 gcc 鏈接靜態(tài)庫時包含 weak 會出現(xiàn)。

gcc 在鏈接靜態(tài)庫時,默認(rèn)的行為是只要找到第一個(不管是不是弱符號),就會將其鏈接,然后停止繼續(xù)尋找,這樣一來,如果你的 weak 是被第一個找到的,那么強定義的函數(shù)就失效了。

這個問題有多種解決方案,我這里只提示一種,有更好的方案可以進qq交流群:577623681 大家一起討論。

解決方案:使用 "-Wl,--whole-archive" 選項來解決。當(dāng)使用這個選項時,鏈接器將整個庫文件都包含在鏈接輸出文件中,而不考慮這些庫文件是否實際上被使用了。

這樣就可以保證弱符號在整個庫中得到了正確的鏈接,并且在可執(zhí)行文件或其他庫中保持有效。

需要注意的是,當(dāng)使用 "-Wl,--whole-archive" 選項時,可能會將一些不必要的庫文件鏈接到最終的可執(zhí)行文件或庫中,這可能會增加最終文件的大小。

因此,應(yīng)該僅在必要時使用這個選項。

文章來源于網(wǎng)絡(luò),版權(quán)歸原作者所有,如有侵權(quán),請聯(lián)系刪除。



關(guān)注【一起學(xué)嵌入式】,回復(fù)加群進技術(shù)交流群。




覺得文章不錯,點擊“分享”、“”、“在看” 唄!

一起學(xué)嵌入式 公眾號【一起學(xué)嵌入式】,RTOS、Linux編程、C/C++,以及經(jīng)驗分享、行業(yè)資訊、物聯(lián)網(wǎng)等技術(shù)知
評論
  • 摘要東莞市恒創(chuàng)連接器有限公司(HCHGCONN)是位于廣東東莞的連接器源頭制造工廠,專注于連接器國產(chǎn)替代、小間距大電流連接器、線對板連接器、線對線連接器、板對板連接器、電源連接器及定制連接器開發(fā)。公司面向工業(yè)自動化、新能源儲能、BMS、汽車電子、AI服務(wù)器、GPU供電、通信設(shè)備、醫(yī)療設(shè)備和智能家居等場景,提供從產(chǎn)品選型、替代評估、樣品驗證到批量交付的一站式連接方案。恒創(chuàng)可支持 Molex、TE Connectivity、JST、Hirose、Samtec 等國際品牌部分系列的國產(chǎn)替代評估。常見替
    HC003 2026-08-07 10:14 180瀏覽
  • 樓宇自控里的“巴別塔”一棟智慧樓宇、一個產(chǎn)業(yè)園區(qū)里,暖通空調(diào)運行著廠商私有協(xié)議,照明系統(tǒng)遵循專屬通信標(biāo)準(zhǔn),變配電、門禁安防各成體系——設(shè)備間數(shù)據(jù)壁壘森嚴(yán),上位平臺對接全靠定制化 “翻譯” 開發(fā),不僅成本高企,交付周期也難以管控。這就是樓宇自控行業(yè)多年的痛點:協(xié)議林立、封閉林立。而破局的鑰匙,早在30多年前就已經(jīng)寫好了——BACnet。作為ASHRAE制定的樓宇自控國際標(biāo)準(zhǔn)協(xié)議,BACnet是如今全球樓宇自控系統(tǒng)(BAS)互聯(lián)互通的“通用語言”。新風(fēng)機、冷源群控、變配電、照明、門禁,凡是需要被樓宇
    飛凌嵌入式 2026-08-10 09:26 221瀏覽
  • 一、方案簡介在Buildroot構(gòu)建的嵌入式Linux系統(tǒng)中部署Flutter應(yīng)用,主流有兩套成熟的開源方案,分別適配不同的顯示場景與開發(fā)需求:方案一:flutter-elinux(Sony開源方案)由索尼官方維護的嵌入式Linux Flutter工具鏈,既支持DRM/GBM直接渲染,也兼容Wayland、X11等多種顯示后端,場景適配性更廣。方案二:flutter-pi(輕量級嵌入器)一款輕量級Flutter引擎宿主程序,僅基于底層DRM/GBM接口實現(xiàn)渲染,無需依賴桌面環(huán)境,資源占用更低,更
    飛凌嵌入式 2026-08-07 09:34 182瀏覽
  • 做電池供電攝像頭、可視門鈴、戶外安防的同學(xué)應(yīng)該都踩過這個坑:攝像頭要拍,ISP、sensor、無線模塊全得開著,整機電流動輒幾百 mA。一節(jié) 18650 撐不了幾天,用戶投訴“怎么又沒電了”。有人會說:加個 PIR 人體紅外不就行了?問題是 PIR 怕熱、怕寵物、怕隔著亞克力/玻璃殼,而且只能感知“有溫差的人體移動”,靈敏度飄忽。真正省電的思路應(yīng)該是:讓攝像頭平時徹底睡死,只有“前面有人/有動靜”時才被一鍵喚醒——而負(fù)責(zé)這個“看門”角色的,最合適的是一顆低功耗雷達。一、為什么是雷達,而不是 PI
    唯創(chuàng)知音語音芯片 2026-08-07 14:44 204瀏覽
  •        很多人只見過封裝在SMD外殼里的小尺寸晶振,卻不知道一顆2016、1612甚至1210封裝的微型石英晶振,從一塊巴掌大的石英原礦,到最終能穩(wěn)定起振的成品,要經(jīng)過十幾道精密工序。它內(nèi)部的石英晶片厚度最薄不到20微米,比普通A4紙的1/5還薄,整個生產(chǎn)過程里哪怕0.1微米的誤差,都會直接廢掉整批產(chǎn)品,這也是小尺寸晶振過去長期依賴進口,國內(nèi)廠商花了十幾年才啃下量產(chǎn)硬骨頭的核心原因。1. 原石定向切割:0.01度的角度誤差都不能有小尺寸晶振的第一步,
    TKD泰晶科技 2026-08-07 08:43 542瀏覽
  • 做藍(lán)牙音箱的工程師大概都碰過這個局面。產(chǎn)品要連手機放歌,要本地播開機提示音和按鍵音,還要接 App 做配網(wǎng)和狀態(tài)上報。三件事拆開,早先的常規(guī)做法是音頻藍(lán)牙一顆料、數(shù)傳藍(lán)牙一顆料、本地播放再掛一顆小 MCU 加一片 Flash。板子越畫越大,BOM 越算越貴,待機電流和固件工作量也跟著漲。WT2605C 出來以后,這套需求可以集成到一顆芯片,就是 WT2605C-32N,該芯片采用QFN32 封裝,4×4 毫米,把音頻藍(lán)牙、BLE 數(shù)傳和 MP3 本地播放三樣全包了。對藍(lán)牙音箱來說,最實在的好處就
    唯創(chuàng)知音語音芯片 2026-08-06 15:14 382瀏覽
  • 產(chǎn)品使用18V供電,配套4串鋰離子電池,需要設(shè)計一個充電器。因為輸入18V,電池最高 16.8V,壓差僅 1.2V。因為壓差太小。使用開關(guān)型的充電控制芯片不穩(wěn)定。嘗試自行設(shè)計一個。整體采用分立三極管 + TL431架構(gòu),分4個功能單元:使能控制回路、限流環(huán)路、TL431 精密恒壓反饋環(huán)路、PNP 功率管主功率輸出回路;實現(xiàn)完整鋰電池充電邏輯。使能控制回路按鍵按下:5V 電壓經(jīng) R12 (2kΩ) 送入 NPN 管 Q3 基極,Q3 飽和導(dǎo)通,對地拉低 R1、R2 組成的分壓控制節(jié)點電位;該節(jié)點直
    southcreek 2026-08-07 13:45 494瀏覽
  •                                                                        
    廣州鐵金剛 2026-08-06 17:44 217045瀏覽
  • 在物聯(lián)網(wǎng)從“萬物互聯(lián)”邁向“萬物智聯(lián)”的進程中,LTE Cat.1憑借其在速率、成本與網(wǎng)絡(luò)覆蓋之間的完美平衡,正成為中低速物聯(lián)網(wǎng)市場的絕對主力。隨著2G/3G網(wǎng)絡(luò)的逐步退網(wǎng)以及新國標(biāo)對終端設(shè)備智能化、定位功能的強制要求,Cat.1模組迎來了爆發(fā)式的增長窗口。在這一關(guān)鍵節(jié)點,基于華為海思Hi2131芯片設(shè)計的LTE Cat.1模組,憑借其在能效、射頻、架構(gòu)及物理規(guī)格上的底層創(chuàng)新,成功打破了“高性能必高功耗”的傳統(tǒng)魔咒,為行業(yè)提供了極具競爭力的連接最優(yōu)解。核心技術(shù)優(yōu)勢:重塑Cat.1能效與連接標(biāo)桿海
    用戶1778981989717 2026-08-05 21:04 206瀏覽
  • 讓微弱脈沖信號更清晰——鎖相放大器集成Boxcar平均器在脈沖激光、泵浦-探測、時間分辨光譜、飛行時間質(zhì)譜等實驗中,真正需要測量的信號往往只出現(xiàn)在一個很短的時間窗口內(nèi),卻被淹沒在遠(yuǎn)大于它的噪聲和背景之中。 針對這類穩(wěn)定重復(fù)的微弱脈沖與瞬態(tài)信號,賽恩科儀為OE2052雙通道數(shù)字鎖相放大器帶來全新的Boxcar Averager功能升級:在鎖相檢測之外,進一步提供從周期波形觀察、門控測量到多周期平均的完整數(shù)字Boxcar測量鏈路。 Boxcar平均器,如何從噪聲中“截取”目標(biāo)信號?Boxcar平均器
    SSI_賽恩科儀 2026-08-07 15:49 18208瀏覽
我要評論
0
點擊右上角,分享到朋友圈 我知道啦
請使用瀏覽器分享功能 我知道啦
主站蜘蛛池模板: 朋友的妈妈2在钱| 棺姬嘉依卡| 长征五b首飞成功| 美味快递员的特殊待遇| 费雪小姐探案集| 灵异事件怪谈| 日本jiz| 给我免费观看片在线电影的| 痲豆传媒免费观看| 八戒八戒网剧在线观看15| 忏悔电影| 《女教师》佐山爱电影| 《蔷薇风暴》| 屠城血证| 花戒指电视剧免费观看| 韩国高清在线观看| 猎豹突击电视剧| 黄豆鸟梅子叫声| 法国夫妇俱乐部第二季剧情简介| 新逃学威龙张浩在线观看| 《我女朋友的男朋友》演员表| 天若有情刘德华| 八戒八戒免费高清完整版| 泽村レイコ| 电影豹妹| 私人航空未删减版在线观看免费| 兵王都市:护花使者全集免费| 于小慧电视剧| 女超人麦乐迪 在线| 最激烈的床震大叫不停| 群演逆袭全集免费| 驯龙高手1普通话版免费| 家政老师2| 数学书上最恐怖一页| 斗罗大陆228集完整版免费| 新继拇7完整版| 华语电视| 高清凶降喜讯未删减| 我可能不会爱你在线观看| 热带雨电影完整版免费看| 女版《壮志凌云》高清完整版| 爱很美味| 黑洞频率| 炸天小姐在线完整版| 恶作剧之吻 电影| 红娘子大结局| 一起愁愁愁在线观看免清| 火线追凶2全集| 《八仙饭店》| 灭火宝贝2美版免费播放| 剑道第一仙动漫在线观看| 电视剧我的后半生全集在线观看| 孙红雷打黑风暴在线观看| 我家的天使国语版全集| 暹罗密码| 傻儿司令| 情人别为我哭泣| 木下凛凛子在线观看| 安徽公共频道直播| 假情真爱 阿华| 曲沃县| 高清暗恋者的救赎未删减| 赘婿在线观看完整版| 《美丽小蜜蜂10姐姐叫》中文字幕高清完整版免费在线观看-八戒影视 | 女朋友的扇贝好粉| 《空调维修工的艳遇》电影| 《顶级销售》免费全集| 安全屋电影| 迪迦奥特曼国语版全集高清| 二龙湖爱情故事2020免费观看| 女儿的朋友韩剧中汉字| 维修工的艳遇在线播放| 女战狼6国语高清免费看| 好男人好资源好电影TV| 借枪电视剧在线观看| 午马僵尸电影全集| 要妈妈播种的1983年电影 | 还珠格格第三部天上人间| 电影《武侠》免费观看| 西游记续集 电视剧 在线观看| 掌门女婿剧情介绍| 百变神龙| 97在线播放免费观看全集电视剧| 王宝强春晚三个节目| 电视剧重生之门免费观看完整版| 电影《需要爸爸播种美国》观看 | 韦小宝玩女大王| 亚塞诺瓦茨电影完整版在线观看| 新妈妈完整版| 男生女生一起愁愁愁电视剧在线观看全集 | 《军事不当》在线播放| 星动烟火| 学生的妈妈5字| 罗小黑战记在线观看| 三年在线免费观看| 老卫和淑容船上第五季| SSNI-409秘密搜查官の女| 高清《大蛇王》在线观看| 又见一帘幽梦吻戏| 《幸福来敲门》| 于荣光电影全集| 《禁忌》1980无删减在线观看| 《女医生4》免费观看全集完整版| 诚实好媳妇韩语中文谐音| 小向まな美| 摩登家庭6 电视剧| 麦乐迪马克斯满天星在线观看 | 高清御赐小仵作2未删减| 杰西壮志凌云2011免费观看| 绿茶妹 电影| 利剑行动电视剧全集| 《剑雨》电影| 纸箱包子| 幸福花园双男主| 吕良伟电影全集国语| 千金肉奴完整版赤坂丽| 麦金尼满天星免费观看| 大鱼海棠资源| 大天大地大人家| 万人之上短剧| 罗莉凶猛| 日本维修工的艳遇2| 保罗3雪莉一家1| 鬼哭狼嚎的意思| 光绪皇帝电视剧| 与君歌在线观看| 高清《前度》免费播放| 斗罗大陆196集在线观看| 保罗一家1-4美国版免费观看| 电影风声未删减版在哪里可以看| 神马电影《女销售》| 影音先锋男人资源813| 佐佐木与宫野| 死亡空间3解说| 偷窥邻居做爰2| 袖珍妈妈大结局| 康熙来了停播| 中科院院士:长新冠是基本事实| 蜜桃成熟时无删减| 哇嘎嘎电影播放免费观看| 奉子成婚| 苍蝇之母未删减| 木下凛凛子中文字幕| 流行美发型图片| 中国大陆电视剧| 麦乐迪在线| 潜龙出渊短剧全集免费| 功夫厨神国语高清在线观看完整版| 口红森林| 夫妻成长日记在线| 美容院特殊三| 南线大追歼| 电影三人一次性体检 | 性奴触手道具玉柱调教-《丰满的继牳3》无删减-成人AV | 按摩三少妇| 商朝电视剧| 法国少女农埸农民影院| 人头豆腐汤 完整版| 朋友的男朋友中字ID| 天骄 电视剧| 漂亮女邻居| 哪吒二在线观看完整免费高清电影 | 最后的大魔王动漫| 中国青年我和我的青春| 苹果电视剧| 斗破苍穹169| 电影云图| 台剧浪漫女家教在线观看全集| 电影法国空乘2019满天星法版 | 麦乐迪马斯克女超人满天星在线播放| 妻子的谎言电视剧免费播放| 亲爱的妈妈 韩国中字| 农厂保卫战满天星| 3d肉蒲电影在线观看| 地爆天星HD未删减版免费观看| 盗墓笔记8全集| 高清《瑜伽教练》无删减| 火红年华电视剧在线播放| 流淌的读音| 孤注一掷在线观看高清免费张艺兴| 电影一路向西在线观看 | 地下偶像sana未增删带翻译| 最近新上的电视剧| 暴力拆迁| 免费全集观看| 爱我多深百度影音| 妈妈职业2的在线观看平台| 雷霆扫毒粤语| 嫡女宅斗:全精通全集免费| 鬼挡路3| 女超人满天星版麦乐迪马克斯在线观看视频| 水卜樱剧情解析图解gif| 胜女的代价剧情介绍| 《少年派》| 甲种公牛在线观看| 银魂175| 韩剧 秘密花园| 《种马3》电影免费观看| 法国电影《金牌销售》在线播放| 狙击手拉苏尔电影免费观看完整版| 长城电影发布会| 图书馆女朋友在线观看完整免费版电视剧第五集 | 麦乐迪马克斯女超人免费观看| 太极张三丰粤语| 泰国女子用氰化物谋杀13名债主| 刀郎演唱会爱是你我| 私人航空1法国满天星免费播放| 狂欲的庄园| 在线观看密爱| 好姑娘2免费高清全集| 江山为重| 门当户对综艺| 电视剧民工全集| 海伦娜的影子电视剧| 大学生特殊按摩| 在线免费观看斗罗大陆| 爆乳理发店特殊服务| 最新蛇片| 性的暴行 在线观看| 美食俘虏| 新人类之毒医肥尸高清在线观看| 二毛驴传奇 电视剧全集免费观看| 克劳福德过人| 关于莉莉周的一切高清| 解放大西南全集| 洪湖赤卫队| 拜托小姐在线观看| 姐姐的朋友4在完整4视频带翻译| 人猿泰山1995版迅雷| 《不被疼爱上司的夫人》演员表 | 桃花映江山免费观看完整版| 招待外卖员电影| 《圣特罗佩斯的姑娘们》在线观看 | 蚌埠市| 手足兄弟短剧| 《隐身的名字》| 斗罗大陆2绝世唐门第一季| 《姊妹牙医》完整版正片| 布达佩斯之恋完整版| 李诞吐槽甄子丹| 狼毒人电视剧全集在线观看免费高清| 《爱情人偶》| 花子VS倔强驱魔师1-4集在在线观看 | 独行夜行电影免费观看高清版| 爱我几何电影免费观看高清完整版| 为什么黛玉是裸死| 《地味变2》免费观看| 信仰1—42集免费观看视频播放| 激战丛林满天星法版完整版| 小蜜桃在线| 西游记之孙悟空三打白骨精下载| 中文在线翻译| 夫君是敌国战神:和亲公主全集免费| 八戒.八戒在线观看8| 狂飙电影免费观看完整版 | 满天星《背叛》| 青春派 电影完整版| 《动漫迷情4》全集免费观看动漫| 绅士的品格在线观看免费完整版| 需要爸爸播种籽2全集免费看| 猛龙过江高清| 能免费看18视频网站| 鸡毛飞上天58集完整版免费观看| 豪迈女大兵1999版美国| 成何体统动漫全集在线观看全集| 大侦探第七季在线观看免费版| 花与蛇3麻醉牙医诊所| 《千言万语》电影| 伦敦上空的鹰| 时光与你别来无恙电视剧免费观看| 高清《卖房子的女人的逆袭》电视剧| 猎情武阎| 小米su7发布会直播| 巨乳按摩电影| 冬春的日子电影字幕版| 飙速宅男第四季| 周弘版村枝(原版)| 聊斋艳谭之孽欲孤鬼| 长相思第二部免费| 极乐凶间 第二季电视剧| 《爱意成空》免费观看大结局 | 千山暮雪被删片段| 女大学沙龙| 顶级人生第一季免费观看| 《民国奇探》免费观看| 我在伊丽莎白截取了一个小片段 | 向往的生活第一季全集| 似锦电视剧在线观看免费| 蛮好的人生26免费| 国产观看免费高清电视剧| 济公活佛第二部全集| 电视剧幸福生活万年长| 美丽的小樱桃美国电影| 韩国伦理电影下载| 麦乐迪家庭矛盾完整版| 古惑仔2高清| 好姐妹高清在线观看免费全集| 极盗行动免费完整版在线观看中文版| 凯登克罗斯在线电影免费观看护士 | 西服女律师替夫还债| 无极免费| 喜爱夜蒲演员| 高清放射危机未删减| 高清《夏日情人》| 小东解说dota| 周星驰赌片| 黄金小子| 一日女采人电影| 电视剧铁在烧| 普京视察图瓦共和国| 再来一次在线观看完整视频| 改则县| 周密周芯竹宣布分手| 风暴在线观看| 毛驴县令之棒子老虎鸡| 海贼王480| 黄金仓库在线观看| 恶作剧之吻1台湾版| 战狼6欧美版战狼6| 李献计历险记下载| 梁飞大英雄电视剧全集在线观看免费| 法国电影空乘1999演员表| 郝板粟电影免费播放| 撒贝宁崔永元| 学生的妈妈| 与部长出差免费观看| 良辰美景好时光西瓜影视| 美国刺客| 《美容院1:特殊待遇》在线观看| 鬼FU全集无删减在线看风车| 婚姻时差电视剧| 喜爱夜蒲之林中小屋| 苍老师最经典10部电影免费观看| 动画片少林传奇| 三年中国免费观看完整版 | 赤子板《姐妹牙医》在线看| 哈利·波特电影全集免费观看| 一本到高清视频免费观看| 神乐桃花| 迷你世界火山| 破处之旅| 兔子更喜欢哪种食物| 日剧second love| 郝板丽千金小姐未删减版| 台湾卖房女销售| 子夜电视剧| 三姐妹瑜伽健身4免费| 漂亮妈妈开家长会| overflower第一季在线观看完整版做饭| 免费同志| 罗颖黄瑞恩官宣分手| 瑞士航空空姐4| 开封奇案| 曹查理电影全部免费观看| 老婆9免费完整高清电视剧在线| 黑蛇呻吟| 俘虏之锁电影免费观看高清版| 老婆6免费完整版高清电视剧| 艰难爱情19| 苹果完整版| 人猿泰山1995版意大利经典电影| 善良的嫂子2 电影| 孙子兵法三十六计| 姐姐真漂亮免费观看| 佳能ixus115| 我国成功发射北京三号b星| 同学的母亲中字ID英文| 亲爱的妈妈3韩国电影中文| 渔女实战2观看| 禹州市| 故宫开车| jizz妇女| 冯巩个人简历简介| 我的时代你的时代免费观看完整版| 罪夜之奔| 元阳县| 最后的华雨滋动漫在线观看| 天海翼《被犯女教师》| 比天堂还美丽 电视剧| 算计七天的死亡游戏| 壮志凌云在线播放满天星| 混凝土市场全集观看| 《法国空乘5》在线免费观看| 法国空姐第5季国语版免费观看| 哈尔滨花式宠爱南方小土豆| 韩国售楼小姐电影免费观看高清版 | 夏奇拉mv| 谁在说慌| 魔力宝贝监狱| 似火流年电视剧| 古浪县| 罗武林向前冲国语全集在线观看| 美国禁忌3睫毛膏| caoliuluntan| 东京塔越南战俘营在线看| 苍狼传世| 曰本jiZZ| 教训美女| 女朋友的妈妈双字ID| 菠萝影院| 罗丽星克莱尔的电影| 木下檀檩子电影2024免费观看| 旗开得胜集体舞| 《性的暴行》日本电影| 冰糖炖雪梨完整版| 农场保卫战完整版免费观看| 《法国空乘5| 高清《妥协》短剧免费观看| 工藤拉拉电影在线| 你好李焕英高清免费| 最棒的情人沼电影| 澡堂家的男人们| 我和保姆的色情片| 一夜深情| 爱的发声练习结局| 电影水母| 黑暗侵袭1| 甄嬛传50集| 妈妈的职业5免费全集| 多大点事| 亚洲激情文学| 进击的巨人第二季第四集| 高压监狱3法国电影完整免费观看| 日漫xl司令第一季| 撩动我心| 行尸走肉第七季全集| 仙逆73| 岛国中文字幕肉蔻之| 《丰满的继牳2》| 新少林寺电视剧| 丞相夫人是首富| 媳妇的美好时代全集下载| 姐妹牙医电影在线看的免费版高清| 之后3在线观看完整版| 《和讨厌的部长出差旅》在线| 高中英雄们| 维多利亚的秘密内衣| 禁忌1980| 不一样的男子| 白峰美羽无码电影观看| 生死速递2| 功夫周星驰国语高清| 董倩采访全红婵| 法国空姐第5季国语版免费观看| 电影不忠结局在线观看免费高清| 澳门人在线看免费观看| 沧元图59集在线观看高清| 82板杨敏思版本1-5电视剧在线| 疯狂的足球高清| 日本H在线观看| 贝拉1980满天星版| 《冬日的什么呀,春日的什么呢》 | 说英雄谁是英雄免费观看| 13一14chinesex破| 新员工韩剧在线观看| 公之浮之中9| 甄嬛传20集| 都市犯罪4在线观看免费高清 | 《侄女开发日记》动漫免费观| 爱在战火纷飞时| 十九岁大学生真人免费观看电视剧 | 金瓶梅在线观完整版观看视频| 坎贝奇《无憾》完整版电影在线观看| 电影丝袜会所| 成都公交车爆炸| 凌云壮志女版满天星MV免费观看| 维修工的老艳遇在线观看| 平安365| 原千岁主演的电影在线观看播放免费 | 豪门弃妇:翻身成商业女王全集免费| 全城热恋20150920| 天生一对泰剧全集免费观看泰剧| 禁忌结局-9| 孤岛飞鹰全集下载| 中国X站在线免费观看| 美食俘虏| 迷人的岳 金珠| 擦枪走火电影完整版| 乳头按摩电影| 教官的小妖精又凶又残电视剧| 姐姐的女朋友5| 只手遮天九千岁1到100集| 极度兽性在线观看| 战狼6妈大牛| 八佰免费完整版在线观看| 高清招魂4:终章未删减| 百色起义| 西藏锅庄| 魔力宝贝监狱免费观看 在线| 斗罗大陆179集| 尸骨无存2免费观看完整版| 酒店1至5集免费| 陆贞传奇在线观看免费全集高清| 电视剧母子情仇| 高柳家的花嫁在线| 电影完整版免费观看| 传说中的故乡| 扫黑风暴连续剧| 王李丹妮《维修工》| 朱莉安妮全集在线观看免费高清| 金瓶梅电影在线完整版观看| 我的不良义姐动漫| 《女房客2》电影| 阳光普照| 朋友的女朋友在线观看| 济公电视剧| 恭喜发财短剧免费观看| 大家庭电影| 外太空杀人小丑| 囧妈免费播出| 高清《新三国》| 柳舟记 电视剧| 衡阳县| 我想和你好好的 下载| 同在屋檐下电视剧全集在线观看 | 法证先锋5电视剧全集在线观看| 头脑特工队电影免费观看中文版| 军事不当免费观看| 斗罗大陆第134集免费| 福尔摩斯 基本演绎法| 国王排名在线观看免费完整版| 假面超人rx全集| 上门推销避孕套当场试货电影| 大道朝天动漫在线观看全集免费播放| 终极三国21| 《乳房按摩》在线观看HD| 坏蛋联盟电影完整版免费观看| 命中注定我爱你21| 不当军事行为线观看| 海绵宝宝全集| 生生世世爱简谱| 第一次竟然给了朋友的| 大嫁风尚免费观看全集完整版高清| 姐妹牙医在线看免费完整版| 男按摩师韩国爱情电影在线播放| 法国电影《农场保卫战》在线观看| 铃原エミリ| 饥饿的瘦6| 《口咬》电影完整版在线观看| 姐姐的朋友2在线观看| 动画片少林传奇| 和大胸大乳继拇做爰| 锦月如歌电视剧36集全| 新有菜电影大全观看| 内江市| 人狼特种部队免费完整版在线观看| 一扑二主全集| 部长来家里喝酒第3季| 元气少女缘结神新婚篇| 甜美日系风| 大槻响作品番号| 我是机器人 电视剧| 还珠格格第一部高清| 少女荷尔蒙6中文版| 佐佐木与宫野| 夜半歌声| 爱我几何完整版在线播放免费| 吴磊周雨彤新剧《爱情而已》| 韩国电影表姐| 幻影丹尼| 日本战狼4免费完整版| 电视剧女儿门| 有鬼住隔壁国语| 没戴奶罩的瑜伽教练| 禁止的爱 免费观看 百度百度 | 监狱女兵免费版| 1987版《娃娃脸》满天星| 小李飞刀翻拍| 寄宿公寓在线观看完整版| 《花子vs倔强驱魔师》第二季免费观看 | 韩国cc| 坎贝奇品味人生无删减在线观看| 手活取精汇编合集| 网球王子电视剧版| 保罗芭芭拉3| 几度夕阳红电视剧| 樊梨花电视剧| 赘婿全集在线观看| 木下凛凛子中文字幕| 《年轻的女仆》韩国电影在线观看| 魔法圣婴百度影音| 华丽的外出| 长歌行免费观看完整版| 二十大观后感| XL司令在线观看免费高清全集| 伊波拉病毒2(国语版)| 徐梦桃高喊我是第一吗| 高清九条的大罪未删减| xl司令第一赛季真人版播放| 高清《环太平洋1》免费观看完整版| 侏罗纪公园4免费高清国语版| 需要爸爸播种免费看| 坐在身上磨豆浆| 偶像来了第二季| 王多鱼打扑克免费在线观看小视频| 蜘蛛侠2| 口香糖女孩乳液3无限爱心版| 站着再来一次第50集电视剧免费播放 | 新金瓶梅电视剧一到五集| 誓言电视剧| 恐龙世界| 流星蝴蝶剑联网| 秋瓷炫《生死决断》在线播放 | 少年卫斯理| 戒爱电影在线观看完整版免费| 二b青年的不醉人生| 新妈妈免费在线观看| 牙医姐妹1986完整版资源| 湄公河大案28集| xl司令免费观看全集高清| 最后一滴血2| 三年大片高清观看完整版在线观看| 暗算全集| 酷龙组合| 《女海盗1》美版免费观看| 隋唐英雄82| 冲上云霄2粤语全集| 插曲的痛60集全集完整版 | 与部长妻子一起过周末的日子| 法国禁忌7中文版| 大地3资源在线高清免费| 韩剧妈妈爱上儿子同学| 飞驰人生在线观看完整版电影| 法国航空4伦理播放| 小男孩摊位上颠勺炒面有模有样| 电视剧黎明破晓前| 为食神探粤语| 《最高の爱人诏》三上悠亚免费观看| 《美姐妹牙医》完整版| 无理的同居| 上海液压机维修| 四位大学位按摩记哪里看| 网红乞丐哥被抓| 《荒岛女儿国》在线观看| 《卿卿我心》电视剧免费观看| 在线播放免费观看全集电视剧 | 春雨全集在线观看免费| 黑狐电视剧在线观看| 高压监狱伦理法国| 电视剧长河落日免费观看完整版| 藏族踢踏舞组合| 风水弃少:改运旺家完整版观看| 我的超级巨星泰剧免费观看| 自宅警备员| 中圆村妓三级片国语| 电视剧知情| 我经过风暴| 王多鱼观看免费全集高清| 西出玉门几点更新| 宇崎学妹要想玩| 男按摩师做乳房按摩伦理片在线播放 | 女版壮志凌云2011满天星在线观看 | 陪部长一起去出差电影叫什么名字 | 金瓶少女电影在线观看完整版免费| 高清《爱情公寓5》电视剧| 泰囧途高清完整版下载| 《炸天小姐》电影免费| 矿山人家| 我的父亲母亲的婚姻电视剧| 神奇动物在哪里字幕| 非诚勿扰泰国女嘉宾| 好大一个家电视剧全集在线观看| 天海冀和部下出差的电影主演是谁| 高清权力王朝:默多克家族| 百合女女互慰吃奶互揉网站| 双人调情按摩术免费观看| 蜡笔小新3| 黑猫警长电影| 马龙被疑打假球| 《印尼空姐》免费观看完整版高清| 霍夫曼钢琴| 隐藏大佬:外卖小哥全集免费| 保罗芭芭拉真人版| 绝世天帝| 紫钗奇缘高清全集| 双女任务在线观看完整免费法剧 | 四少妇精油按摩电影| 百万新娘之爱无悔67| 妻子的秘密 韩国电视剧| 公之浮中手2| 破产姐妹 第三季| 加勒比海盗女版1观看| 人间中毒在线观看未删版完整版| 校草追求:学霸女神全集免费| 姐姐的朋友2在线| 《大侦探 第十一季》未删减| 春节起源于什么时期| 替夫还债十日| 下辈子我再好好过第二季| 巨乳学院漫画| 《法国少女》2| 谈情说案国语| 老爸的爱情全集| 小鱼影剧| 韩国电影r在线| 新还珠格格97| 因为我太傻中文歌词| 爱如潮涌电视剧| 大嫁风尚电视剧| 美国版荷尔蒙9| 太阳之城免费观看完整| 《安全屋》| 女性3对1:两个人一次性体检2| 电影朋友的妈妈| 《插曲的痛》全集免费看| 免费观看90分钟高清电视| 月鳞绮纪全集免费播放电视剧最新 | 唐朝禁宫秘史在线观看| 卖房的女销售| 电影非诚勿扰2在线观看| 电视剧前行者免费观看完整版| 欢乐颂二| 《销售秘密》3| 午夜凶铃3d| 流浪地球2完整版在线看观看免费| 神话成龙版| 东京食种| 男女一起愁愁愁全集下载| 使徒行者4| 电影《法国女仆》免费观看| 维多利亚一号周楚楚| 变形计山呼海唤| 要爸爸播种子电影| 风筝电视剧免费观看| write as 走麻绳| 急诊护士电影免费观看完整版| 新生电影| 火箭军副司令吴国华昨晚自尽| 法国婬乱私人航空6| 二十不惑在线观看| 仙逆动漫免费在线| 虎符传奇电视剧| 杨敏思版1-5集电视剧免费看| 爱的妇产科4| 咱们结婚吧全集免费观看| 埃及皇后2003版满天星| 醉酒迷奸电影在线播放| 至尊红颜贾静雯| 哭悲医院五人干了啥| 女拳击手满天星免费播放| 美国禁忌三部曲满天星| 拜托了老师全集| 活佛济公3全集| 《G点》1985欧美在线| 爵迹3风津道| 龙兄虎弟电影| 夫妻的世界完整版| 我的1997电视剧全集| 超级飞侠动画片| 木下檀子的电影免费观看国语完整版| 奇妙的美发沙龙2| 乌鸦小姐和蜥蜴先生| 女律师的坠落完整版日剧| 我的吸血怪好友| 随心所欲电影免费观看| 三个夜班医生玩弄护士| 卖房子的女销售3艺术片| 视频免费观看高清| 原神旅行者插雷电将军的游戏| 四位少妇按摩记| 《妻子3》在线观看| 美人鱼电影| 银鞋1980美国满天星| 妈妈的职业2观看全集免费高清中文 | 丧尸世界大战| 女版战狼6免费观看999战狼6| 教官的小妖精又凶又残电视剧| 一仆二主电视剧| 需要爸爸播种电影在线观看| 爱情睡醒了40集| 秘密人质| 客厅享受的两小时| 插曲的30集全集免费播放| 乌托邦替夫还债40分钟在线播放最新集 | 偷情五日| 花与蛇4下载| 夫妻那些事大结局| 和讨厌的部长出差电影| 桃花映江山免费观看全集| 乘风破浪的婚姻免费完整版短剧| 来自妈妈的绣感2国语版叫什么名字| ふたりは无敌在线观看免费| 七年级下册英语单词朗读| 春宫真情人| 爸爸我想要你的种子| 消失的初恋第四集| 《巨人族的新娘》动漫免费观看| 上司交换夫妇木下凛凛子| 白白电影| 天生一对泰剧全集免费观看泰剧| 准备好了没2:我来了全集观看| 和讨厌的部长出差旅| 女大学生的沙龙室完整版完整版| 天津名流相声茶馆| 东京塔之越南女兵俘虏| 苍月女战士AV无删减版| 这就是街舞3免费高清完整版 | 我年轻的瘦子4()艺术片V| 平果香儿歌原唱完整版的| 捉奸侦探| id002热门经典电影免费观看| 插曲的痛120集在线观看免费下载 需要爸爸的种子播种免费观看 | 军事不当行为完整版| 初恋是姐姐动漫全集免费观看| 飞梦菲梦少女第二季免费观看| 电影熟睡之中被义子侵犯| 阿凡提的故事| 绝品邪医的桃花劫短剧免费观看| 新津县| 哥哥给我一个机会电影| 动漫烟花| 《维修师傅的艳遇HD》中文| 婆婆妈妈| 生活有点甜 电视剧| 电影《特邀外卖员》演员表| 出轨同学会在线看| 印度合伙人| 李晓杰mv| 花房姑娘8季在线观看免费| 贵妃还乡在线观看| 螺丝钉动画片| 遮天 全集| 黄志忠《国家行动》| 战狼6欧式少女全部剧情介绍大全视频 | 蓝色隐身帽子| 骄阳伴我免费观看全集| 李连杰电影下载| 老妈和我一起嫁| 同学的妈妈中韩双字ID贤宇| 日剧《太想被你爱了》百度云| 姐姐6免费完整高清电视剧| 2002电影高清完整版在线观看| 电影报道| 沉默的真相在线观看免费完整版| 交换温度4| 荒野渔夫80版完整版| 搏击之王之反击电影完整版免费观看 | 长河落日 电视剧| 打扑克免费视频| 爆火短剧单亲妈妈| 兰陵王电视剧下载| 七擒萌货| omoflow第一季全集免费观看 | 富宁县| 观看韩国伦理电影丈夫下属| 小屁孩日记2| 乡村爱情5部免费全集电视剧| 电影塔日酒店| 《沉香如屑》电视剧| 剑道独尊全集免费观看| 师奶兵团粤语|