如何使用库

新手上路,请多包涵

出于某种原因,我永远无法使用任何语言的外部库。我正在寻找有关如何使用外部库以及它们如何工作的说明/解释。当我在线搜索时,我得到的片段似乎从未适用于我下载并尝试和使用的任何库。我在 mac 和 pc 上工作,C++ 示例很好。我使用带有 C++ 插件的 eclipse IDE。如果有适用于所有库的说明,那就太好了。

原文由 sinθ 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 957
2 个回答

假设你有一个类 Unuseful 定义如下:

文件 Unuseful.h

 class Unuseful {
public:
    void printUnusefulStatement();
};

文件 Unuseful.cpp

 #include "unuseful.h"
#include <iostream>

void Unuseful::printUnusefulStatement()
{
    std::cout << "Hello world!" << std::endl;
}

现在,您有另一个需要打印无用语句的类:

 Unuseful u;
u.printUnusefulStatement();

这意味着您要使用包含要包含在代码中的特定实现 ( printUnusefulStatement ) 的外部库。

您可以通过两种方式使用此库:

  1. 通过向编译器提供源代码
  2. 通过向链接器提供二进制文件(之前已为您的体系结构编译)

案例 1:在编译时使用库

这是最简单的情况。您拥有必须使用的库的源代码,只需将其与现有代码一起编译(例如 main.cpp 文件)。通常,您是库(完成您需要的任务的类)的作者和用户。

使用此命令编译:

 g++ main.cpp unuseful.cpp

允许您在 main.cpp 文件中使用所需的实现。

案例 2:链接库

案例 1 相比,您通常没有要使用的库的源代码。您只有头文件( Unuseful.h ,继续示例)和 静态共享 库(可能[*] libunuseful.alibunuseful.so 文件,分别)。

静态库是在最终可执行文件中链接的目标文件 ( *.o ) 的存档,而是在运行时动态加载共享库(查看 此页面 以更好地了解差异) .

通过使用 ar 程序简单地归档 *.o 文件来创建静态库:

 # Create the object files (only one here)
g++ -c unuseful.cpp
# Create the archive (insert the lib prefix)
ar rcs libunuseful.a unuseful.o

共享库是使用 g++ -shared 选项创建的:

 # Create the object file with Position Independent Code[**]
g++ -fPIC -c unuseful.cpp
# Crate the shared library (insert the lib prefix)
g++ -shared -o libunuseful.so unuseful.o

Let’s suppose now you have the Unuseful.h file and the shared library ( libunuseful.so file) and you have a main.cpp file that instantiates a Unuseful 对象并调用 printUnusefulStatement 方法。

如果您尝试编译此文件( g++ main.cpp ),链接器会抱怨,因为它找不到 printUnusefulStatement 符号。

是时候使用这个库了:

 g++ main.cpp -L. -lunuseful

-L 选项告诉链接器在哪里搜索库文件和 -l 标志告诉链接器要使用的库的名称(没有 lib )。

现在创建了可执行文件( a.out ,因为我没有指定不同的名称),并且您已经使用库来实现您需要的功能( printUnusefulStatement )。

由于共享库是在运行时加载的,因此 a.out 可执行文件的执行可能会因为系统无法找到该库而失败。通常,这可以通过适当地设置一个环境变量来解决,该变量指示用于搜索动态库的路径:

 # Set the LD_LIBRARY_PATH [*]
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.

完成,现在您的可执行文件已经编译,它将能够运行和加载它需要的库。

结论

这是对库的快速概述,我希望可以帮助您了解它们是如何使用和提供给其他人的。

有很多方面需要更详细的研究,如果你有兴趣的话: g++ 创建共享库时的选项, ar 选项,环境变量,共享库格式等等.

[*]: 在 Unix 环境下

[**]:如果目标机器支持,则发出与位置无关的代码,适用于动态链接并避免对全局偏移表大小的任何限制。此选项在 m68k、PowerPC 和 SPARC 上有所不同。与位置无关的代码需要特殊支持,因此只能在某些机器上工作。 [来自 g++ 手册页]

原文由 Vincenzo Pii 发布,翻译遵循 CC BY-SA 3.0 许可协议

从这里开始 http://en.wikipedia.org/wiki/Library_(computing)

基本上,“库”是编译函数和类声明的集合。

在 Mac 上,还有一些“框架”,它们有点类似于 Pascal 的单元,包含声明和编译代码。

在 Java 或 C# 等托管语言中,有包和程序集。两者都与图书馆密切相关。

要在 C 或 C++ 中使用库,您必须拥有一个 .lib 文件(或大多数基于 POSIX 或 GCC 工具链的编译器的 .a 文件)和编译到 .lib 文件中的函数原型。根据您的开发环境(对于 Eclipse,您很可能使用 GCC 编译器和带有 LD 链接器的 GNU 工具链),您只需指定库文件(.lib 或 .a)作为链接器的输入。大多数情况下,该库都附带包含函数原型定义的头文件。

即使您不知道链接器,这很奇怪,这些库仍然隐式地在您的程序中使用 - std::cout 在 libstdc++ 或 C 运行时库中。

作为一个庞大的库和一组有用的 C++ 类的示例,您可能希望查看 Boost。

要在 Windows 上编写 GUI,您可以使用 MSDN 中描述的 WinAPI。

要在 Mac 上编写 GUI,您可以使用 Carbon API,它有点类似于 WinAPI,但现在已弃用。为 MacOS 编写“合法”GUI 的唯一方法是使用 Cocoa 和 Objective-C。

要编写跨平台 GUI,您可以使用很多库:Qt、wxWidgets、GTK。

最后的但并非最不重要的。 C++ 不是 GUI 的最佳语言。

原文由 Viktor Latypov 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题