2015-01-09 37 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

相关问题