2010-04-18 29 views
0

出口現有的C++項目的Makefile.in(Ubuntu的),它有這個:有助於瞭解在Linux中Makefile.in

EXPORTS  = \ 
     gtkmozembed.h \ 
     gtkmozembed_glue.cpp \ 
     gtkmozembed_internal.h 

你能告訴我是什麼做出口呢?

謝謝。

+0

看其出口變量使用的地方。宣言本身不足以理解會發生什麼。 – 2010-04-18 07:57:19

+0

這是從Firefox(嵌入/瀏覽器/ gtk/src/Makefile.in) – 2010-04-18 23:31:52

回答

1

EXPORTS只是文件列表的名稱。這可能意味着這些文件正在安裝到其他人可以使用它們的位置。包含對圖書館用戶不感興趣的實現細節的頭文件可以保密。

EXPORTS中的.cpp文件可能意味着它包含用戶必須編譯並鏈接到其項目的框架代碼。

你的例子來自Firefox。它的定義如下:

export:: $(EXPORTS) 
    $(INSTALL) -m 444 $^ $(PUBLIC_EXPORT_DIR) 

在Makefiles中複製或安裝文件有點問題。請注意,副本與原始文件之間不存在相關性。

0

想象一下:
您是庫(DLL)的設計者。你必須定義圖書館必須要做的事情,然後寫下它。許多進程可以使用你的函數從這個DLL中,你的RAM中有一塊內存。
當你將這個庫包含到你的項目中時(例如在C++中),你必須添加一些關於這個DLL中的函數的信息。

第一個選項:
您可以聲明庫函數的某些接口(然後您的鏈接器很高興;))。 例如:__declspec(dllexport)int my_function(char *);
出口對象的名稱後,在程序中完成(連接工作;))...但這個對象的名稱 依賴於語言,編譯器,等等等等

第二個選項:
您添加到項目你的庫的一些信息鏈接器(文件* .def)。該文件有兩個部分:LIBRARY和SECTIONS。 LIBRARY是您的lib的內部名稱:
庫my_lib
在EXPORTS部分中,可以從庫中導出的符號。
EXPORTS
功能1
功能2
功能3

你可以看到,這個功能沒有的類型,形式參數等等。當你有這樣的lib,你沒有關於功能的任何信息。

當你這樣做(.def文件)並編譯你的lib時,你已經有了.dll和.lib文件。第二個文件可以用來在執行時連接庫。
如果您想在此庫中檢查導出,您可以使用「Dependecny Walker」或「dumpbin」:
dumpbin my。dll/exports

接下來您可以加載該庫:
第一個選項:__declspec(dllimport)int my_function(char *);

秒:HMODULE LoadLibrary(LPCSTR lpszLibName);

conlusion:使用出口可以創造更多的通用LIB(但更復雜)

(對不起,我很不好英語:/)

+0

謝謝。但是如果'出口部分是可以通過庫導出的符號',爲什麼在我的例子中它有.h文件? – michael 2010-04-18 20:14:35