我正在开发一个 C 代码,它应该可以使用 codeBlocks 在 Linux 和 Windows 下移植。 我应该包含 NetCDF C 库和 HDF5 库。
显然,linux 中的库有时是 .so 和 .a。在 Windows 中,无论是 .lib 还是 .dll。 它们之间有什么区别,我应该使用哪一种?我在linux下使用了.so并且它可以工作,但我想知道为什么它应该工作。
第二个问题是我包含文件 netcdf.h 和 hdf5.h Linux 中的路径与 .../lib/netcdf.h 和 ..\lib\netcdf.h 不同 虽然我知道每次在 Windows 和 Linux 之间切换时都可以更改链接,但我确信应该有一种方法可以避免源代码中没有文件重复的情况。
有人可以告诉我如何处理这个问题吗?
提前致谢。
最佳答案
可执行文件(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
P.S:您可以在代码中具有平台差异的任何位置使用 ifdef 开关
关于c - 库之间的区别以及如何包含它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27868633/