1

我在使用 irrklang 库时遇到问题。我从https://www.ambiera.com/irrklang/downloads.html下载了 .zip 文件。我有一台装有 Mojave 10.14.6 的 MacBookPro。

我尝试编译以下源代码:

#include <stdio.h>
#include <irrKlang.h>
using namespace irrklang;
#pragma comment(lib, "irrKlang.lib") // link with irrKlang.dll
int main(int argc, const char** argv){
    printf("\nHello World!\n");
    return 0;
}

我有一个目录,其中包含

  • 主文件
  • 包括 -> 头文件
  • bin -> 它包括子目录dotnet-4-64, macosx-gcc, linux-gcc-64,winx64-visualStudio
  • bell.wav, getout.ogg
  • 生成文件

Makefile 非常简单(我从examples原始 .zip 文件的目录中改编了一个):

CPP = g++
OPTS = -dynamiclib -I"include" -L"bin/macosx-gcc" -lirrklang -pthread

all:
    $(CPP) main.cpp -o example $(OPTS)

clean:
    rm example

我添加了该-dynamiclib选项,因为否则链接器会在/usr/lib.

当我运行Make一切似乎工作正常,没有错误,但如果我尝试执行./example我得到以下错误:

-bash: ./example: cannot execute binary file

我在网上搜索,我发现的唯一提示是检查file ./example与我的操作系统的兼容性:结果是

./example: Mach-O 64-bit dynamically linked shared library x86_64

正如预期的那样,二进制文件实际上是在这个操作系统中可执行的。我看不到问题,有人有什么建议吗?

4

2 回答 2

1

dynamiclib 选项使 gcc 生成共享库而不是可执行文件。正如您在 的输出中看到的file ./example,它确实是一个动态链接的共享库,而不是一个可执行文件。

您应该使用-L指定库路径的选项。尝试将绝对路径传递给-L选项。

于 2020-03-30T19:58:13.930 回答
1

除了此处的其他答案之外,您还需要做一件事。macOS 上的动态库包含一个“加载路径”,它告诉操作系统在启动与其链接的可执行文件时在哪里可以找到所述库来加载它。此加载路径从 dylib 读取并在链接时烘焙到您的可执行文件中,这就是您在评论中报告问题的原因。

Apple 提供了一个实用程序install_name_tool,用于在链接后修补可执行文件中的加载路径,因此从您发布的内容来看,您可能需要以下内容:

install_name_tool -change libirrklang /bin/macosx-gcc/libirrklang example

这里有一篇很好的文章:

https://medium.com/@donblas/fun-with-rpath-otool-and-install-name-tool-e3e41ae86172

于 2020-03-31T20:38:57.803 回答