如何使用库

出于某种原因,我永远无法使用任何语言的外部库。 我正在寻找如何使用外部库的说明/解释,以及它们如何工作。 当我在网上search时,我得到的碎片似乎不适用于我下载和试用的任何图书馆。 我在Mac和PC上工作,C ++的例子都很好。 我使用eclipse IDE和C ++插件。如果有适用于所有库的说明,那就太棒了。

假设你有一个class级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 )的存档,而共享库则是在运行时dynamic加载的(查看此页面以更好地了解其差异)。

使用ar程序简单地存档*.o文件即可创build静态库:

 # 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选项创build的:

 # 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.so文件),并且您有一个main.cpp文件来实例化一个Unuseful对象并调用printUnusefulStatement方法。

如果你试图编译这个文件( g++ main.cpp ),那么连接器会报错,因为它找不到printUnusefulStatement符号。

是时候使用图书馆了:

 g++ main.cpp -L. -lunuseful 

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

现在可执行文件( a.out ,因为我没有指定一个不同的名字)被创build,并且你使用了一个库来实现你需要的function( printUnusefulStatement )。

由于共享库在运行时被加载, a.out可执行文件可能会因为系统无法find库而失败。 通常情况下,这可以通过适当地设置一个环境variables来解决,该环境variables指示用于searchdynamic库的path:

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

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

结论

这是对图书馆的快速概述,我希望能帮助您了解如何使用和提供给他人。

如果您感兴趣,有许多方面需要更详细的调查:创build共享库,选项,环境variables,共享库格式等时的g++选项。

[*]:在Unix环境中

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

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

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

在Mac上,还有一些“框架”,它与Pascal的单元有些相似,并且包含声明和编译的代码。

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

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

即使你不知道链接器,这是足够奇怪的,库仍然在你的程序中隐式使用 – std :: cout是在libstdc ++或C运行时库中。

作为一个巨大的库和一组有用的C ++类的例子,你可能想看看Boost。

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

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

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

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