2009-08-05 134 views
25

我需要一些編寫跨平臺代碼的幫助;不是應用程序,而是圖書館。C++跨平臺動態庫; Linux和Windows

我創建了一個靜態和動態庫,大部分開發都是在Linux中完成的,我得到了在Linux中生成的靜態和共享庫,但現在想要在窗體中生成一個靜態和動態庫的Windows版本.lib.dll使用相同的源代碼。

這可能嗎?我有點擔心,因爲我注意到使用_dllspec或類似的源代碼生成Windows .dll所需的文件。

如果不是那麼任何人都可以告訴我最好的和最快捷的解決方案,讓我的代碼在Windows上編譯。我不需要在Linux下編譯我很樂意在Windows下直接編譯。此外,我使用兩個外部庫,這兩個庫都是boost和Xerces XML,我已經在Windows和Linux系統上安裝了這些庫,所以希望它們不應該成爲問題。

我真正想要的是擁有一個可以在Linux和Windows下編譯的源代碼副本,以生成特定於每個平臺的庫。只要我可以擁有單一的源代碼副本,我並不在乎是否必須編輯代碼以支持Windows或Linux。

+0

交叉編譯通常是指在另一個平臺上構建軟件。既然你說你需要可以在Linux和Windows上編譯的源代碼,那麼你的問題更多的是編寫一個可移植的,跨平臺的源代碼庫,而不是交叉編譯。 – 2009-08-05 19:16:25

+0

GIYF其實,在這種情況下,libtool是你的朋友... – 2009-08-05 19:17:28

+0

當你等待答案時,檢查CMake:http://www.cmake.org/ – Pete 2009-08-05 19:18:15

回答

18

一般來說,有兩個問題需要去關注:

  1. 的是,在Windows上,你的DLL明確出口的符號,應該是可見的外部世界(通過__declspec(dllexport)要求,並
  2. 能夠保持生成系統(理想情況下,不必維持一個單獨的makefile文件和Microsoft Visual C++項目/解決方案)

對於第一個,你需要了解__declspec(dllexport)。在僅限Windows項目,通常以我在this question的答案中描述的方式實施。您可以通過確保您的導出符號(如MY_PROJECT_API)已定義但進一步擴展,但在爲Linux構建時擴展爲無。這樣,您可以根據需要將導出符號添加到代碼中,而不會影響Linux構建。

第二,你可以研究某種跨平臺的構建系統。

如果您對GNU工具集感到滿意,您可能需要調查libtool(可能與automake和autoconf結合使用)。 這些工具本身在Linux上受支持,在Windows上通過CygwinMinGW/MSYS受支持。 MinGW還爲您提供了交叉編譯選項,即在運行Linux時構建本機Windows二進制文件。我發現在導航Autotools(包括libtool)方面有用的兩個資源是"Autobook"(具體爲DLLs and Libtool部分)和Alexandre Duret-Lutz's PowerPoint slides

正如其他人所說,CMake也是一種選擇,但我不能自己說話。

+0

謝謝,我做了一些谷歌搜索和猜測我搜索了錯誤的東西,libtool聽起來有趣,也許cmake像上面提到的人。我對Linux有點新鮮,所以這個工具不會很快響起來:p – 2009-08-05 19:25:04

9

你可以很容易地用#ifdef來做到這一點。在Windows _WIN32應該由編譯器(即使是64位),所以這樣的代碼

定義
#ifdef _WIN32 
# define EXPORTIT __declspec(dllexport) 
#else 
# define EXPORTIT 
#endif 

EXPORTIT int somefunction(); 

應該爲你工作確定。

+0

嗯,是的,我想過了,我會看看那會怎麼樣,如果我沒有運氣,以上工具 – 2009-08-05 19:46:19

+0

@iQ:即使使用上述工具,您仍然必須這樣做。他們不會爲您處理導出,他們只是隱藏了不同平臺上構建過程之間的一些差異。 – 2009-08-05 20:44:24

+0

是的我猜你的權利,我將不得不使用宏。我目前正在嘗試查看代碼塊,我認爲它可以自動爲您定義一個.def文件,但我不知道它有多好或多壞。我將不得不試驗一下。 – 2009-08-06 16:02:47

7

也許如果你添加的extern 「C」 這是更好!!!,

/*文件的CMakeLists.txt */

SET (LIB_TYPE SHARED) 

ADD_LIBRARY(MyLibrary ${LIB_TYPE} MyLibrary.h) 

/*文件MyLibrary.h */

#if defined(_WIN32) || defined(__WIN32__) 

    #if defined(MyLibrary_EXPORTS) // add by CMake 

    #define MYLIB_EXPORT extern "C" __declspec(dllexport) 
    #else 

    #define MYLIB_EXPORT extern "C" __declspec(dllimport) 

    #endif /* MyLibrary_EXPORTS */ 

#elif defined(linux) || defined(__linux) 

#define MYLIB_EXPORT 

#endif 


MYLIB_EXPORT inline int Function(int a) 

{ 
    return a ; 
} 
+1

爲了上帝的愛,請使用更好的格式! – tstenner 2010-01-20 15:50:01

+0

@tstenner你的意思是說,當人們編寫自己的格式風格時,你不僅僅是絕對喜歡它們,因爲他們正在輸入他們的代碼? :) – 2013-02-23 07:03:33

+0

@tstenner同意..這個「格式」它太..我怎麼說.. – 2015-06-01 23:51:15