Двоичный файл не исполняемый - c ++ & irrklang - PullRequest
1 голос
/ 30 марта 2020

У меня проблемы с использованием библиотеки irrklang. Я скачал файл .zip с https://www.ambiera.com/irrklang/downloads.html. У меня есть MacBookPro с Mojave 10.14.6.

Я попытался скомпилировать следующий исходный код:

#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-64, macosx-gcc, linux-gcc-64, winx64-visualStudio
  • bell.wav, getout.ogg
  • Makefile

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

Я добавил * Опция 1031 *, потому что в противном случае компоновщик ищет библиотеку в /usr/lib.

Когда я запускаю Make, кажется, что все работает нормально, без ошибок, но если я пытаюсь выполнить ./example, я получаю следующее ошибка:

-bash: ./example: cannot execute binary file

Я искал в Интернете, единственная подсказка, которую я нашел, состояла в проверке file ./example совместимости с моей ОС: результат

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

и, как и ожидалось бинарный файл фактически исполняемый в этой ОС. Не вижу проблемы, есть у кого-нибудь предложения?

Ответы [ 2 ]

1 голос
/ 31 марта 2020

Помимо другого ответа здесь, есть еще одна вещь, которую вам нужно сделать. Библиотеки Dynami c в macOS содержат «путь загрузки», который сообщает ОС, где найти указанную библиотеку для загрузки, когда запускается исполняемый файл, связанный с ней. Этот путь загрузки считывается из dylib и заполняется в вашем исполняемом файле во время компоновки, поэтому вы получаете сообщение о проблеме, о которой сообщаете в комментариях.

Apple предоставляет утилиту под названием install_name_tool для исправления нагрузки путь в исполняемом файле после компоновки, поэтому из того, что вы опубликовали, вы, вероятно, захотите что-то вроде:

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

Здесь есть хорошая запись об этом:

https://medium.com/@donblas / fun -с-RPATH-otool-и-установки-имя-инструмент-e3e41ae86172

1 голос
/ 30 марта 2020

Опция dynamiclib заставляет g cc создавать общую библиотеку вместо исполняемого файла. Как видно из вывода file ./example, это действительно динамически связанная разделяемая библиотека, а не исполняемый файл.

Вы должны использовать опцию -L для указания путей к библиотекам. Попробуйте передать абсолютный путь к опции -L.

...