如何使用图书馆


77

由于某种原因,我永远无法使用任何语言的外部库。我正在寻找有关如何使用外部库以及它们如何工作的说明/解释。当我在线搜索时,我得到的片段似乎永远不会应用于我下载并尝试使用的任何库。我同时在Mac和PC上工作,C ++示例很好。我将eclipse IDE与C ++插件一起使用。如果有适用于所有库的说明,那将很棒。


1
当您std::cout << "Hello World";使用库时。你可以再详细一点吗?
杰西·古德

您的最后一个问题涉及#include <iostream>,因此您在某种程度上已经使用它们了吗?您的问题是开放式的,尝试一些特定的问题,然后问一个问题。

2
我认为我的问题揭示了我对编程的了解很少。我的意思是该语言未内置库(如果有任何意义)。
SINθ

6
不属于语言的库通常称为“第三方库”
Rob Kielty 2012年

请不要要求教程。您应该针对特定的编程问题询问特定的问题。由于Stack Overflow隐藏了您的
jww

Answers:


180

假设您有一个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)的归档,这些文件在最终的可执行文件中链接,而共享库则在运行时动态加载(请在此页上查找,以更好地理解它们之间的区别)。

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

# 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

假设现在您拥有Unuseful.h文件和共享库(libunuseful.sofile),并且有一个main.cpp实例化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 ++手册页]


6
刚刚发现了这个……非常感谢您提供清晰的解释。我已经完成了整个过程,但是一些小细节

6

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

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

在Mac上,还有一些“框架”,与Pascal的单位有些相似,既包含声明,也包含编译后的代码。

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

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

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

作为一个巨大的库和一组有用的C ++类的示例,您可能需要看一下Boost。

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

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

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

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


9
最后一点是有争议的,最好的!=最简单的,很多严肃的UI仍然是用C ++编写的。例如,所有的浏览器都包括Chrome,其中包括Chrome,Chrome是新的,并且在设计时具有多种选择。

2
好。我同意。一切都取决于。当想到可移植性时,除了C / C ++,无需过多考虑。但是,可以以特定于平台的方式实现前端,并且C ++可以用于所有业务逻辑。
Viktor Latypov'4

您说的最后一个,好像我们可以使用另一种语言编写GUI一样,而C ++仅用于核心吗?怎么来的?
星光

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.