【问题标题】:Unable to link dynamic library in macOS无法在 macOS 中链接动态库
【发布时间】:2017-05-08 02:49:12
【问题描述】:

我正在尝试在我的 C 项目中使用名为 quirc 的 C 库。到目前为止,我通过修改使用 Linux .so 文件的Makefile 生成了一个libquirc.dylib.1.0

quirc/helloquirc.c

#include <quirc.h>
#include <stdio.h>


int main() {

    struct quirc *qr;

    qr = quirc_new();

    if (!qr) {
        printf("Failed to allocate memory");
    }

    quirc_destroy(qr);

    return 0;
}

我已经在存储库的根目录下创建了上述源文件。我正在使用以下命令来编译它:

gcc helloquirc.c -lquirc -L. -Ilib -o helloquirc

据我了解,-l 标志指定动态库的名称,-L 标志指定动态库的位置,-I 标志指定头文件的位置,-o 指定可执行文件的名称。

当我运行此命令时,我收到以下错误:

ld: library not found for -lquirc
clang: error: linker command failed with exit code 1 (use -v to see invocation)

我使用这一行更改了Makefile

.PHONY: libquirc.dylib
libquirc.dylib: libquirc.$(LIB_VERSION).dylib

libquirc.$(LIB_VERSION).dylib: $(LIB_OBJ)
    $(CC) -shared -dynamiclib -o $@ $(LIB_OBJ) $(LDFLAGS) -lm

并将.so.$(LIB_VERSION) 的其他实例更改为.$(LIB_VERSION).dylib

【问题讨论】:

  • libquirc.dylib.1.0 是否与helloquirc.c 存在于同一目录中?您是否尝试将-L. 标志放在 -lquirc 标志之前?
  • @Evert 对这两个问题都是肯定的

标签: c macos gcc


【解决方案1】:

quirc 的构建方式有问题。正确的库名称应该类似于 libquirc.1.0.dylib ,并带有一个名为 libquirc.dylib 的符号链接。

看起来 quirc 有一个手写的 makefile,而不是使用像 gyp 或 cmake 这样合理的东西。只要您不尝试在多个平台上构建共享库,手写的 makefile 就可以了。

但是,如果您只是自己编译它,如果您只使用静态库,您可能会发现事情更简单。如果您不与任何人共享共享库(如果没有其他程序使用libquirc完全相同的副本),那么拥有共享库是没有意义的。

【讨论】:

  • 我更改了Makefile 以生成libquirc.1.0.dylib,而不是通过更改更新后的帖子中的行仍然是相同的问题。我肯定会考虑把它变成一个静态库,但我也想解决这个问题
  • 你做了符号链接吗?链接器正在寻找普通的libquirc.dylib,但它不知道您实际上在寻找libquirc.1.0.dyliblibquirc.dylib.1.0something_else_entirely.dylib
  • @Carpetfizz:请记住,您可以将库作为文件传递给链接器,而不是使用-lmylib -Ldir,您可以只传递dir/libmylib.a 或其他任何东西。
  • 创建符号链接似乎已经成功了谢谢!你介意打印你说的最后一件事的完整命令吗?
  • 你可以用gcc helloquirc.c -lquirc -L. -Ilib -o helloquirc代替gcc helloquirc.c libquirc.1.0.dylib -o helloquirc
猜你喜欢
  • 1970-01-01
  • 2017-12-27
  • 1970-01-01
  • 2019-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-27
  • 2018-02-10
相关资源
最近更新 更多