由于某种原因,我永远无法使用任何语言的外部库。我正在寻找有关如何使用外部库以及它们如何工作的说明/解释。当我在线搜索时,我得到的片段似乎永远不会应用于我下载并尝试使用的任何库。我同时在Mac和PC上工作,C ++示例很好。我将eclipse IDE与C ++插件一起使用。如果有适用于所有库的说明,那将很棒。
由于某种原因,我永远无法使用任何语言的外部库。我正在寻找有关如何使用外部库以及它们如何工作的说明/解释。当我在线搜索时,我得到的片段似乎永远不会应用于我下载并尝试使用的任何库。我同时在Mac和PC上工作,C ++示例很好。我将eclipse IDE与C ++插件一起使用。如果有适用于所有库的说明,那将很棒。
Answers:
假设您有一个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
要包含在代码中的特定实现()。
您可以通过两种方式使用此库:
这是最简单的情况。您拥有必须使用的库的源代码,只需要将其与现有代码(例如main.cpp
文件)一起编译即可。通常,您是该库(完成所需任务的类)的作者和用户。
使用以下命令进行编译:
g++ main.cpp unuseful.cpp
允许您使用main.cpp
文件中所需的实现。
与案例1相比,您通常没有想要使用的库的源代码。您只有头文件(Unuseful.h
继续该示例)和静态或共享库(可能分别是[*]libunuseful.a
和libunuseful.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.so
file),并且有一个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 ++手册页]
从这里开始 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的最佳语言。
std::cout << "Hello World";
使用库时。你可以再详细一点吗?