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

Posted

技术标签:

【中文标题】二进制文件不可执行 - c++ & irrklang【英文标题】:Binary file not executable - c++ & irrklang 【发布时间】:2020-03-30 19:36:44 【问题描述】:

我在使用 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 包括 -> 头文件 bin -> 包含子目录dotnet-4-64macosx-gcclinux-gcc-64winx64-visualStudio bell.wav, getout.ogg 生成文件

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

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

【问题讨论】:

【参考方案1】:

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

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

【讨论】:

亲爱的@Paul,非常感谢!使用您发布的链接并关注有关install_name_toolotool 和类似信息的信息,我发现了我必须做的事情: - 在 bin/macosx-ggc 目录中,我输入了install_name_tool -id "@rpath/libirrklang.dylib" libirrklang.dylib - in the sound` 目录(其中example二进制是)我输入了install_name_tool -add_rpath "@executable_path/lib/" libirrklang.dylib,一切都像魅力一样!谢谢!【参考方案2】:

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

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

【讨论】:

亲爱的@sparik,谢谢,你说得对。我试图通过在libirrklang.dylib 所在的位置写入-L"bin/macosx-gcc 来修改Makefile。 Make运行良好,当我尝试执行文件时,我得到dyld: Library not loaded: /usr/local/lib/libirrklang.dylib`原因:找不到图像`如果我写绝对路径也是一样。好像又在/usr/local/lib找图书馆了,对吗? 您是否尝试为 -L 选项指定绝对路径? 是的,我尝试了-L"Users/USERNAME/Documents/Code/Soundtest/bin/macosx-gcc"-L"~/Documents/Code/Soundtest/bin/macosx-gcc":编译时再次没有错误,但是在尝试执行二进制文件时,我收到了之前评论中写的错误消息。

以上是关于二进制文件不可执行 - c++ & irrklang的主要内容,如果未能解决你的问题,请参考以下文章

C++ 二进制文件 & 顺序读写

QProcess 执行一个 c++ 文件

Spotfire 7.6 中的 NPV 和 IRR

TypeScript 转译的文件是不可执行的

C++ linux在部署环境中安装可执行文件

如何在 C++ 中将字符串从十进制代码转换为西里尔文/unicode16?