2015-01-09 71 views
-1

我正在開發一個C代碼,該代碼在Linux和Windows下使用codeBlocks應該是可移植的。 我應該包含NetCDF C庫和HDF5庫。庫之間的區別以及如何包含它們

很明顯,linux中的庫有時是.so和.a。在Windows中,無論是.lib還是.dll。 他們之間有什麼區別,我應該使用哪一個?我在Linux下使用.so,它工作正常,但我想知道它爲什麼應該起作用。

第二個問題是,我包含文件netcdf.h和hdf5.h 路徑不一樣Linux中的/ lib/netcdf.h和.. \ lib \ netcdf.h 雖然我知道每當我在Windows和Linux之間切換時,我都可以更改這些鏈接,但是我相信應該有一種方法可以避免源代碼中的文件重複。

任何人都可以請讓我知道如何處理這個問題?

在此先感謝。

+1

這個問題是兩個(大多數不相關的)問題。不是很好。 – alk 2015-01-09 20:29:16

+0

還*庫*鏈接,而不是「*包括*」d。 – alk 2015-01-09 20:29:52

+0

問題是,我應該在同一個項目中添加一個指向庫netcdf.a或.so或.bib或.ddl的鏈接以及包含文件.h的鏈接。這就是爲什麼我在同一個問題中問所有人:)。感謝你的理解 :)。 – 2015-01-09 20:32:44

回答

1

可執行文件(Windows中的PE,Linux中的ELF),靜態庫,共享庫可以具有相同的代碼 主要區別在於它們被編譯的方式以及它們將被加載到內存中的方式)

Linux中的「.a」和Windows中的「.lib」做同樣的工作,稱爲靜態庫,靜態庫僅在編譯時需要,當您使用靜態庫中的函數時,函數代碼爲被複制到您的結果可執行文件,因此在運行可執行文件時您確實需要完整的庫,這會導致比使用共享庫更大的可執行文件。

Linux中的「.so」和Windows中的「.dll」也是一樣的,與靜態庫的區別在於它們的函數沒有複製到可執行文件中,它們只在可執行文件中指向,所以你需要運行庫附近的可執行庫

第二個問題並不是真正的問題,你可以在Windows上同時使用「/」和「\」,但如果它碰巧是一個問題,可以使用IFDEF開關:

#ifdef _WIN32 
//Windows based code 
#include <windows_headers.h> 
#elif __linux 
//Linux based code 
#include <linux_headers.h> 
#else 
#endif 

PS:您可以使用IFDEF在你的代碼,有平臺的差異隨時隨地切換

+0

謝謝Marware爲你提供有用的答案。問候。 – 2015-01-11 11:33:36

相關問題