我在使用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;
}
我有一个目录,其中包含
dotnet-4-64
,macosx-gcc
,linux-gcc-64
,winx64-visualStudio
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/