(五) Winelib開發元件(1)

2021-07-06 09:33:03 字數 4684 閱讀 2576

這一小結包含的內容有:

winemaker

編譯資源檔案:wrc

spec檔案

鏈結(一):winemaker

1:對visual c++專案的支援

winemaker支援visual c++專案檔案。支援的檔案型別位.dsp,.dsw,.vcproj和.sln。他檢測要被使用的定義,這些自定義包括路徑,要被鏈結的庫和構建乙個特定目標的原始碼檔案。

用法是非常簡單的,僅僅講專案檔案的路徑來替換原始碼資料夾的路徑。

$ winemaker --lower-uppercase myproject.vcproj

$ make

2:winemaker原始碼分析

即使沒有windows makefile檔案或者是visual studio檔案開始,winemaker也能夠工作(它並不知道對windows makefile檔案做什麼工作)。這牽扯到需要做許多可能錯誤的猜測。這一小結主要是解釋一下winemaker工作的細節,讓你能夠更好的理解和修改他。

在核心中,winemaker對你的原始碼樹做了乙個遞迴遍歷來尋找目標和原始碼檔案。我們從目標開始。

第乙個就是可執行程式和dll庫。每一次他在乙個目錄中找到乙個,winemaker將他新增到構建的列表中並且在每乙個目錄中生成乙個makefile檔案。注意,winemaker也知道release和debug目錄,所以,他將會把在這個目錄下找到的可執行程式和庫放到他的父目錄中。當他找到乙個可執行檔案和乙個dll的時候,winemaker是開心的,因為這會比下面的情況給他更多的資訊。

如果他找不到任何可執行程式或者是dll檔案,winemaker將會尋找擴充套件名為.mak的檔案。如果他們不是偽裝的visual c++專案,winemaker將會假設在這個目錄中那個名稱的目標檔案將會被構建。但是他並不知道這個目標是不是乙個可執行檔案或者是乙個庫。所以他將會假設這個是預設的型別之一,例如乙個圖形應用,你可以通過使用--cuiexe--dll選項來替代。

最後,winemaker將會檢查是否都存在乙個名稱為makefile的檔案。如果存在,他就會假設這個目錄存在乙個要被構建的目標檔案。但是他並不知道這個目標的名稱或者是型別。對於型別,他將會按照上面的方式去處理。對於名稱,他將會使用目錄的名稱替代。事實上,如果目錄以src開始,winemaker將會嘗試使用他的父目錄的名稱替代。

一旦這個目錄的目標被建立了,他就會檢查他是否包含乙個混合的可執行檔案和目錄。如果是這樣的話,他將會把這個目錄中所有的庫鏈結在一起來構建他。

如果上面的兩步不能產生期望的結果的話,你應該設定winemaker到互動式模式。這會允許你為每乙個目錄指定目標列表。

在每乙個目錄中,winemaker也會尋找原始碼檔案:c,c++或者是資源檔案。如果在這個目錄中他發現了構建的目標,他將會基於這些目標的名稱嘗試去分配每乙個原始碼檔案到這些目標之一。不與任何乙個目標相匹配的原始碼檔案將會放到這個目錄的全域性列表中,檢視在makefile檔案中的extra_***變數,與每乙個目標相鏈結。這裡的假設是這些原始碼檔案包含了所有的目標共享的公共**。如果在這些檔案所在的目錄中找不到任何目標,他們將被分配到父目錄中。所以如果在父目錄中找到了乙個目標檔案,他也會「繼承」在他子目錄中找到的原始碼檔案。

最後,winemaker也會尋找一些其他檔案例如.h標頭檔案,包含inline函式的.inl檔案和其他檔案。既然他們並不被直接編譯,他們就不會被放在普通的原始碼檔案列表中。但是他會依然記著他們以便在需要修改原始碼檔案的時候處理他們。

一旦遞迴遍歷目錄完成,就會修改原始碼檔案。這個步驟中的兩個主要的任務就是修復crlf問題和驗證include語句的問題。winemaker會對每乙個原始碼檔案做乙個備份(以符號鏈結被保留的方式),然後隨著他的進行讀取他修復crlf問題和其他問題。一旦他完成了對這個檔案的工作,他就會檢查是否完成了那些非crlf相關工作的修改,如果沒有刪除的話,就會刪除備份檔案。

檢查include語句的問題(或者是被原始碼檔案引用的檔案),是在原始碼檔案專案的上下文中完成的。這樣的話winemaker就能使用正確的包含路徑了。如果winemaker所包含的路徑的目錄中沒有找到相應的檔案,他將會把所有的檔案都會重新命名成小寫。(這個可以使用–nolower-include來重寫).

最後winemaker生成makefile檔案。從上面的描述中,你可能會猜測到在有些方面可能會出錯:巨集定義,包含路徑,dll路徑,引用的dll,庫路徑,鏈結的庫。你可以使用winemaker的-d,-p,-i,-i,-l,和-l選項來解決這些問題。你也可以使用winemaker的互動模式,你可以為每乙個專案/目標指定不同的設定。

舉個例子,你很有可能遇到的乙個問題就是strict巨集。如果strict沒有開啟的話一些程式將不會被編譯;如果他啟用的話,其他一些檔案將不會被編譯。

幸運的是給定的原始碼樹的所有的檔案都是使用相同的設定,所以你需要做的就是在winemaker命令列中或者是在makefile檔案中新增乙個-dstrict選項。

最後,丟失或者是重複符號可能的原因有:

3:互動模式

當winemaker分析你的**的時候,互動模式將會詢問你確認或者是改變選項。當編譯mfc或者是每乙個專案/目標有不同的設定的時候這可能是非常有用的。你應該考慮使用下列的方式來增加更多的選項。

$ winemaker --interactive .

$ make

4:makefile檔案

makefile就是你的makefile檔案。如果你想定製的話,你就需要修改這個檔案。下面是對他內容的詳細解釋:

srcdir                = .

subdirs =

dlls =

libs =

exes = hello.exe

這裡列出了這個目錄的目標在**。名稱就自我解釋的很清楚了。subdirs通常僅僅是位於頂層的makefile檔案。對於庫和可執行檔案,指定全名稱,包括.dll,.a,或者是.exe副檔名。注意這些名稱一定要都是小寫。

### 常用設定

defines = -dstrict

include_path =

dll_path =

dll_imports =

library_path =

libraries =

這一小節包含了全域性編譯設定:在這個makefile檔案中他們應用到所有的目標中。libraries變數允許你指定被鏈結的unix庫。注意你不能在這裡指定winelib庫。為了鏈結乙個winelib庫,應該使用dll_imports。對於c++庫會出現異常,當前你沒有別的選擇只能在unix上鏈結他們。你很可能找到的乙個庫就是mfc。

其他的變數的名稱應該是自我解釋的很清楚了。也存在cextra,cxxextra和rcextra允許你指定其他的標誌,分別為c編譯器,c++編譯器和資源編譯器。最後要注意所有的這些變數都包含選項的名稱。

然後對於每乙個目標都有乙個節點,每乙個描述了目標組成的變數元件。

### hello.exe 原始碼和設定

hello_exe_c_srcs = hello.c

hello_exe_cxx_srcs =

hello_exe_rc_srcs =

hello_exe_dll_path        =

hello_exe_dlls =

hello_exe_library_path =

hello_exe_libraries =

上面的變數指定了如何去鏈結目標。注意,他將他們新增到這個檔案開始的全域性設定中。

dlls域是你列舉可執行程式引入的dll列表的地方。他應該包含dll的全名稱,而不是-l選項。

hello_exe_objs        = $(hello_exe_c_srcs:.c=.o) \

$(hello_exe_cxx_srcs:.cpp=.o) \

$(hello_exe_rc_srcs:.rc=.res)

上面僅僅是構建除了與目標相對應的物件檔案。這個列表後來被用於鏈結指令。

### 全域性原始碼列表

c_srcs = $(hello_exe_c_srcs)

cxx_srcs = $(hello_exe_cxx_srcs)

rc_srcs = $(hello_exe_rc_srcs)

這一小節構建了原始檔的「總結」列表。

### 通常目標

all:

$(subdirs) $(

dlls

:%=%.so) $(

libs) $(

exes)

上面首先定義了這個makefile檔案的預設的目標。這裡他嘗試去構建所有的目標。

### 目標指定構建規則
注:

crlf問題解釋

(六) Winelib開發元件2

話接上節!二 編譯資源檔案 wrc 為了編譯資源,你應該使用wine資源編譯器,簡寫為wrc,該編譯器會生成乙個二進位制.res檔案。當編譯spec檔案的時候,該資源檔案會被winebuild使用。winemaker生成的makefiles檔案會幫你照料好。但是,如果你要編寫自己的makefile檔...

REST framework 五 認證元件

rest framework 的認證元件是在 apiview dispatch下執行的。跟著原始碼過了下,了解它的實現過程。上圖源 中的self.authenticators就是乙個認證元件類的乙個列表,我們在接下來後面的自定義認證元件時,就要注意這裡面的源代源內容,自定義類的類名可以自己起,而類中...

Flex元件開發

sunday,may 11th,2008 原文在這裡 tutorial the flash and flex marriage 這也是乙個在flashide中建立flex元件的好教程,值得好好研究!tags component posted in flex元件開發 friday,may 9th,20...