库之间的区别以及如何包含它们

时间:2015-01-09 20:23:35

标签: c shared-libraries static-libraries codeblocks libraries

我正在开发一个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 个答案:

答案 0 :(得分:1)

可执行文件(Windows中的PE,Linux中的ELF),静态库,共享库可以具有相同的代码 主要区别在于它们的编译方式以及它们将被加载到内存中的方式(执行)

" .A"在Linux和" .lib"在Windows中执行相同的工作,称为静态库,静态库仅在编译时需要,当您使用静态库中的函数时,函数代码将被复制到您生成的可执行文件中,因此您在运行时需要完整的库可执行文件,导致比使用共享库更大的可执行文件。

"。所以"在Linux和" .dll"在Windows中,也是一样的,与静态库的区别在于它们的功能没有复制到你的可执行文件中,它们只是在可执行文件中指向,所以你需要附近的实际库运行时中的可执行文件

第二个问题不是真正的问题,你可以使用" /"和" \"在Windows上,但如果它恰好是一个问题,你可以使用ifdef开关:

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

P.S:您可以在代码中的任何位置使用ifdef切换,它具有平台差异