c++ - 二进制文件不可执行-C++和irrklang

标签 c++ makefile binaryfiles irrklang

我在使用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;
}

我有一个目录,其中包含
  • main.cpp
  • include->头文件
  • bin->它包括子目录dotnet-4-64macosx-gcclinux-gcc-64winx64-visualStudio
  • bell.wav,getout.ogg
  • Makefile

  • Makefile非常简单(我从原始.zip文件的examples目录改编了一个):
    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
    

    如预期的那样,二进制文件实际上可以在此OS中执行。我看不到问题,有人有什么建议吗?

    最佳答案

    除了此处的其他答案外,您还需要做其他一件事。 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

    关于c++ - 二进制文件不可执行-C++和irrklang,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60938209/

    相关文章:

    c++ - 什么时候使用初始化列表构造函数?

    c++ - optarg 设置为空

    c++ - 在 C++ 中从二进制文件获取整数值时的垃圾值

    c++ - 将整数分成数字,反向打印,并打印数字的总和C++

    C++ 流与 C 风格的 IO?

    perl - cpan(1) 失败,返回 'Cannot allocate memory'

    makefile - 为具有多个依赖项的单个目标编写 Makefile 规则

    c++ - make 中对 `main' 的 undefined reference

    c++ - 读取二进制文件并打印其内容(Web 服务器)

    c - 写入二进制文件