【问题标题】:How to use shared object file in c compilation如何在c编译中使用共享对象文件
【发布时间】:2017-03-06 15:44:30
【问题描述】:

我正在尝试在 macOS Sierra 上使用 gcc Apple LLVM version 8.0.0 (clang-800.0.42.1) 来使用 this C 库。我已经完成了以下步骤:

  1. make libquirc.so

  2. 复制libquirc.so到我的项目目录

  3. gcc -o quirc_test quirc_test.c -L. -l libquirc.so.1.0

它会产生错误:

quirc_test.c:1:10: fatal error: 'quirc.h' file not found
#include <quirc.h>
         ^
1 error generated.

quirc_test.c

#include <quirc.h>

这是我第一次尝试在 C 语言中做任何事情,其他有关使用 link 标志编译的相关问题似乎没有帮助,如上所示。

【问题讨论】:

  • 它说的文件丢失在哪里?
  • @ChrisTurner 它在仓库中。我以为编译后的.so 文件包含所有需要的信息?
  • 寻求调试帮助的问题(“为什么这段代码不起作用?”)必须在问题本身中包含所需的行为、特定问题或错误以及重现它所需的最短代码 。没有明确问题陈述的问题对其他读者没有用处。请参阅:如何创建最小、完整和可验证的示例。
  • 在这里工作了5年,你应该知道How to Ask

标签: c gcc shared-libraries


【解决方案1】:

C 有点原始。共享对象库不包含它们实现的 API 的声明——至少没有足够详细或编译器可以理解的形式。

您需要头文件quirc.h 在您可以找到的地方。您可以像库一样将其复制到当前目录中,但您需要对 include 语句进行细微调整。

#include "quirc.h"

如果包含的文件用双引号而不是尖括号括起来,它将首先查找源代码目录而不是系统头目录。

另一种方法是将库安装在某处,例如/usr/本地。您的库将进入 /usr/local/lib 并在 /usr/local/include 中找到您的标头。如果这样做,请在编译器命令行上使用 -I 指令来告诉编译器在哪里查找标头,例如

cc -I/usr/local/include -L/usr/local/lib -lquirc  quirc_test.c

【讨论】:

  • 我注意到 repo 包含一个 /lib 目录,其中包含其他目标文件和头文件,包括 quirc.h。将整个内容复制到我的项目文件夹中是否有意义?在这种情况下,我需要 -I 标志吗?
  • 不幸的是,我不能make install,因为该库安装了一些使用演示,这些演示依赖于 macOS 上不可用的 linux 依赖项。
  • 您可以手动安装库和标头,只需将它们复制到正确的位置并设置权限和所有权(您需要 sudo)。如果您选择将 lib 保存在您自己的目录中,您会发现如果将其移动到其他任何位置,该 exe 将无法运行。
猜你喜欢
  • 2020-02-07
  • 1970-01-01
  • 1970-01-01
  • 2017-03-24
  • 2018-04-04
  • 1970-01-01
  • 1970-01-01
  • 2013-04-16
  • 1970-01-01
相关资源
最近更新 更多