【问题标题】:Difference between libraries and how to include them库之间的区别以及如何包含它们
【发布时间】:2015-01-09 20:23:34
【问题描述】:

我正在使用 codeBlocks 开发应该在 Linux 和 Windows 下可移植的 C 代码。 我应该包括 NetCDF C 库和 HDF5 库。

显然,Linux 中的库有时是 .so 和 .a。在 Windows 中,无论是 .lib 还是 .dll。 它们之间有什么区别,我应该使用哪一个?我在 linux 下使用 .so 并且它可以工作,但我想知道为什么它应该工作。

第二个问题是我包含文件 netcdf.h 和 hdf5.h linux 中的路径不一样 .../lib/netcdf.h 和 ..\lib\netcdf.h 虽然我知道每次在 windows 和 linux 之间切换时我都可以更改链接,但我确信应该有一种方法可以避免源代码中没有文件重复的情况。

谁能告诉我如何处理这个问题?

提前致谢。

【问题讨论】:

  • 这个问题是两个(大部分不相关的)问题。这不好。
  • 还有 libraries 是链接的,而不是 "include"d.
  • 问题是我应该在同一个项目中添加指向库 netcdf.a 或 .so 或 .bib 或 .ddl 的链接以及指向包含文件 .h 的链接。这就是为什么我在同一个问题中问所有人:)。感谢您的理解:)。
  • 最简单的方法是使用make文件。 make 文件将包含一个 #ifdef (用于识别 windows)...windows 版本的编译/链接语句 #endif 后跟 #ifdef(用于识别 linux)... linux 版本的编译/链接语句

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


【解决方案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

P.S:您可以在代码中存在平台差异的任何地方使用 ifdef 开关

【讨论】:

  • 感谢 Marware 为您提供有用的答案。问候。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多