【问题标题】:Cannot link library when compiling with gcc使用 gcc 编译时无法链接库
【发布时间】:2019-10-15 11:35:26
【问题描述】:

我的目录结构是:

── bin
│   ├── mylib-osx.so.1.72
│   ├── mylib.so.1.72
├── my.c

我正在尝试编译 my.c 并链接 mylib-osx.so.1.72(我在 macOS 上),但无济于事:

ld: library not found for -l:PhotoDNAx64.so.1.72

我试过了:

  • gcc -o my -lmylib-osx my.c
  • gcc -o my -lmylib-osx.so.1.72 my.c
  • gcc -o my -lmylib my.c
  • gcc -o my -L./bin -lmylib-osx my.c
  • gcc -o my -L./bin -l:"mylib-osx.so.1.72" my.c

我做错了什么,为什么找不到库?

【问题讨论】:

  • 阅读MacOSX链接器的文档(可能是ld程序)

标签: c gcc shared-libraries


【解决方案1】:

我做错了什么,为什么找不到库?

了解Invoking GCC。 您没有阅读该内容是错误的(或gcc 的任何其他文档)。

gcc 的程序参数顺序很重要(在实践中,有几个参数非常有用,例如至少-Wall 和-g,有时可能-v) .你想要类似的东西

gcc -v -Wall -g my.c -lmylib-osx -o my

(也可以尝试它的变体),因为 gcc 正在运行一些 ld 或等效的 linker 命令,如果你想传递一些 -Llib-directory 使用一些东西喜欢

gcc -v -Wall -g my.c  -L./bin -lmylib-osx -o my

你还需要阅读 MacOSX 的文档linker(可能命名为ld)。您还可以阅读 Levine 的 Linkers and loaders 书。

如果您对gcc 不满意(但请使用最新版本,所以 2019 年的 GCC 8,而不是 Apple 销售的名为 gcc 的蹩脚软件)考虑使用 Clang(也是最新版本,例如 2019 年的 Clang 8)。它在程序参数的顺序方面与gcc 具有相同的限制(因为程序参数的顺序甚至对 Unix 或 POSIX cc 很重要)。

一般来说,在询问有关该命令的问题之前,请阅读该命令的文档。 Apple(或 Linux)计算机上的最小值 man gcc。

PS。我最后一次使用 MacOSX 是在 2004 年。我有偏见的建议是安装和使用 Linux(我从 1993 年开始使用;我在不到一年的时间里在 2004 年左右尝试了 MacOSX,并且对operating system 都感到失望,包括它的 display server 和 GUI desktop environment,并由 Apple 硬件提供)。

【讨论】:

  • 我尝试了各种组合,但无济于事。在这种情况下,我需要阅读有关链接器的哪些内容?显然整本书不是一个选择;与更改操作系统相同。
  • 你需要阅读gcc和ld的文档,因为gcc正在调用ld
猜你喜欢
  • 2016-02-12
  • 2013-11-28
  • 1970-01-01
  • 2020-04-22
  • 2023-03-11
  • 2015-09-01
  • 2019-01-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多