【问题标题】:How to compile a static library and link to it using g++?如何使用 g++ 编译静态库并链接到它?
【发布时间】:2023-03-03 13:46:01
【问题描述】:

我一直在尝试安装一个库 (gzstream),它由一个 .C、一个 .h 和一个适当的 makefile 组成。为了能够使用 gzstream.C 使用的 #include <gzstream.h>,我将 gzstream.h 文件放在 /usr/local/include 中,将 gzstream.C 放在 /usr/local/lib 中。

当我尝试编译 aufgabe2.cpp 时,我在终端上收到以下错误消息。 aufgabe2.cpp:1:22: fatal error: /usr/local/include/gzstream.h: Permission denied compilation terminated.

我做错了什么?

【问题讨论】:

  • 你没有把它放在那里。您可以告诉编译器在别处寻找#inlcude 文件。但是,该文件现在有什么权限?因为我相信/usr/local/include/ 应该具有全面的读取权限,除非您将该文件作为 root 移动。如果您想在不经过该目录的情况下包含某些内容,请使用 g++ -I<directory> 考虑:Tell g++ where to find includes
  • 我对 linux 系统没有那么丰富的经验,所以我不知道您所说的“以 root 身份移动该文件”是什么意思。我通过命令gksudo nautilus 将.h 文件放在usr/local/include/ 中,然后将文件复制粘贴到所述目录中。运行你给我的命令,返回以下错误g++: fatal error: no input files

标签: c++ linux static-libraries


【解决方案1】:

在能够使用静态库之前,您需要对其进行编译。这将要求您 cd 到 gzstream 源代码所在的目录,然后键入 make

这将编译库并创建一个输出文件libgzstream.a

准备就绪后,您可以包含头文件并编译您的代码。 不需要将 gzstream.h 复制到 /usr/local/include 中。它也可以驻留在您的源代码所在的本地目录中。然后它可以很容易地包含在

#include "gzstream.h" 

查看如何使用双引号而不是尖括号来指示当前目录中的相对路径。

g++ 命令行应该是这样的。

g++ aufgabe2.cpp -L。 -lgzstream -lz

-L。告诉链接器在当前目录中查找静态库。这假设 libgzstream.a 被复制到 aufgabe2.cpp 所在的源目录。如果不是,则给出存在 libgzstream.a 的 -L 参数的相对路径。

参数 -lgzstream 和 -lz 要求链接器链接这些库。

【讨论】:

  • 我笨,没想到他还没编译,或者还没有lib。这可能是解决方案。他将 gzstream.C 放在库中的事实应该已经放弃了。
  • 我想使用尖括号,因为 gzstream 库中的 .C 文件使用 #include <gzstream.h> 并且我想避免弄乱库文件。我想我可以替换 .C 文件中的尖括号。我会尝试这样做。
猜你喜欢
  • 2012-02-23
  • 1970-01-01
  • 1970-01-01
  • 2012-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多