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

标签 c shared-libraries static-libraries codeblocks libraries

我正在开发一个 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/

相关文章:

c - 如何更改 C 中结构属性的大小?

c++ - 在共享库中使用共享库

linux - 如果同一个共享库被不同的应用程序和不同的目录加载,它是否在内存中共享?

c++ - 是否有任何 C++ 库可用于 WMI?

xcode - 将静态库添加到 XCode 控制台应用程序

c - fgetc内部如何工作

c - C语言中标准输入的问题

c - 只需要 1 个输入。需要很多输入

java - Tomcat 中的共享 JNI 库 (.so) - UnsatisfiedLinkError

ios - 从同一应用程序中的框架访问 iOS 应用程序中嵌入的静态库