2011-05-31 32 views
2

我目前在Ubuntu Linux中工作。我正在与 一个.hpp文件和.cpp文件。从这两个我 创建一个.a文件(如dll为了使用和我的应用程序在任何已安装linux的计算机上使用 )。如何在标题中添加文件夹以及.a如何工作?

我提的是,这两个.HPP and.cpp在文件夹1.

我想问:

  1. 如果我包括从像一个文件夹的.cpp头: #include "/home/tests/folder1/folder2/header.h" 在我使用ar rcs创建.a并在另一台计算机上发送我的.a后,此项工作是否正常?

  2. 是否会影响.a创建的文件夹中的特定标题的路径?

  3. 如果我不得不下载例如gSOAP的为了 来完成我的任务,我创建后 的.a文件,其中包含了很多.xml.cpp/.h文件 从gSOAP的和我的.h.cpp文件我需要 创建一个生成文件,以便在计算机上下载gsoap 我想用我的.a(或dll在windows) 应用程序?

+0

这些答案中的任何一个能解决您的问题吗? – 2011-06-10 15:20:55

回答

1

“是否会影响.a创建的文件夹中特定标题的路径?” - 只能是调试信息。如果将其复制到另一个地方,则不会阻止其工作。

  • * .a是一个静态库。它就像* .lib在windows中 - 不像* .dll

  • 您可以将任何静态和动态库(* .a/*。所以在linux中,* .lib/*。dll在windows中)移动到任何文件夹/计算机/星球,并在依赖关系得到满足时使用它(提供所有必需的动态和静态库,软件,硬件,您的库依赖)。当然,使用库来运行代码将需要您编译的CPU架构以及代码直接或间接使用的所有动态库。

  • 与问题没有直接关系的问题:不要用绝对路径#include文件。永远。定义和使用包含目录。这是一个风格和可读性的问题。包括像"/home/user/working_dir/blabla.h""D:/working_dir/blabla.h""..\..\some\directory\blabla.h"是丑陋和不可维护的。包括像<blabla.h><blabla/defs.h>对于库API是完美的,像“blabla.h”或“subdir/blabla.h”对于内部头文件可以。

1
  1. “已安装Linux的任何计算机” 是行不通的。 Linux包含各种平台和体系结构,与Windows通常只包含两个(而64位版本向后兼容32位版本,因此.dll总是可用)不同。

    如前所述,.a静态库,相当于Windows .lib,而不是.dll。等效于Windows .dll的Linux是.so“共享对象”。

  2. 编号#include由编译前的步骤中的预处理器解决。文件的内容被直接插入到内存中的源文件的副本中,然后编译整个文件。文件夹中的字符串不是存在于您的实际编译模块中。

    那就是说,写绝对路径的形式很不好。这意味着你无法在任何地方移动你的开发环境/目录。使用相对路径:它们应该相对于您当前的工作目录和/或您定义的包含路径。阅读您的工具链文档以获取更多信息。

  3. 如果你静态链接gsoap,那么你不必做任何事情。它被编译到你的项目中。

    如果要动态链接它,则.a不应包含gsoap的任何.cpp文件。目标计算机必须安装gsoap共享库,这将是安装程序或用户必须解决的必需依赖项。

    Makefiles不要下载依赖关系。包管理者呢。

1

实际上,“.a”文件是一个档案文件。 Linux为它的库文件选择了这种格式,所以你可以将其与“.lib”(“.so”相当于“.dll”的粗略等同)进行比较。

编译有几个阶段:预处理,编译,汇编和链接。

预处理有效地回答你的第一个问题,因为.h/.hpp文件中的代码被插入到.cpp文件中,这意味着当你的代码被编译时,成功编译.cpp文件所需的所有代码都在那一个文件。

编译将您的代码转换为您正在使用的特定计算机的汇编指令。这意味着如果您的代码是为在PowerPC计算机(Mac)上运行构建的,则您的代码将使用任何PPC计算机可以使用的计算机指令(即英特尔,AMD,SPARC,Alpha等计算机无法使用您的代码)。这回答了有关将“.a”文件移动到另一台计算机的问题 - 只要计算机的处理器和操作系统兼容,就可以使用它(您可能有64位处理器,但这并不意味着32位Windows会让你使用它的全部容量)。

装配将原始的基于文本的汇编指令转换为处理器可以理解的机器指令。这会创建一个目标文件(Windows上的.obj,Linux上的.o)。这个文件是库中的东西(Windows上的.lib,Linux上的.a)。还有机器指令的其他名称,如“机器代码”和“目标代码”,其中任何一个都可用于描述相同的事物。

链接是最后阶段。它从库和各种必要的目标文件中获取必要的代码,并将它们转换为实际的二进制文件(Windows上的.exe文件,因为它的设计原因,Linux不需要扩展)。这是你的应用程序。

因为链接是最后一个阶段,所以除了你的库之外,还必须指定gsoap库(例如),否则链接器会说它找不到某些“符号”。但是,与您的库一样,gsoap库必须位于该计算机上才能使用它。尽可能使用软件包管理器进行安装,但如果不能这样做,则需要在该计算机上进行编译。如果您正在从PPC计算机迁移到Intel/AMD计算机,则还需要重新编译库以及gsoap(如果无法通过软件包管理器安装gsoap)。

相关问题