Как правильно читать данные в формате MATLAB в C ++? - PullRequest
0 голосов
/ 15 марта 2020

Я пытаюсь прочитать файл данных в формате MATLAB (data.mat) в C ++. Я сослался на следующий пост " Ссылка mat.h в файле C ++ " и попробовал приведенный пример кода.

using namespace std;
int main() {
MATFile *pmat;
pmat = matOpen("data.mat","r");
return 0;
}

Из ответа на пост я выполнил пример кода используя следующую команду,

Command:
g++ main.cpp -o out -I/Applications/MATLAB_R2019a.app/extern/include -L/Applications/MATLAB_R2019a.app/extern/lib -lmat

Output:
ld: library not found for -lmat
clang: error: linker command failed with exit code 1 (use -v to see invocation)

Чтобы это исправить, я скопировал 'mat.h', 'matrix.h' and 'tmwtypes.h' в каталог кода. Но теперь, когда я запускаю код, я получаю другую ошибку, и я не могу найти никакого решения для этого.

Command:
g++ main.cpp -o out

Output:
Undefined symbols for architecture x86_64:
  "_matOpen_800", referenced from:
      _main in main-d0f06c.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

Может кто-нибудь, пожалуйста, помогите мне с этим. Я использую Ma c OS Mojave. Спасибо.

1 Ответ

0 голосов
/ 15 марта 2020

Я никогда не использовал MacOS на P C. Я даже не знаю, вызывал ли OS одно и то же имя на каждом типе устройства. То, что вы видите здесь, является проблемой связывания во время выполнения.

Вы передаете компоновщику флаги, которые сообщают компоновщику, где искать символы и какие символы будут. И тогда бинарный файл построен. Но во время выполнения ld (двоичный компоновщик / загрузчик исполняемых файлов. Это может быть тот же компоновщик / загрузчик, который создал ваше конкретное приложение) будет искать символы Dynami c в местах, которые являются стандартными к ОС.

Как я уже сказал, я не привык к MacOS. Я использую Linux сейчас. Например, my Linux использует /usr/lib и /usr/local/lib путь для поиска динамических c библиотек. Способ, которым программа ld ищет символы, можно настроить несколькими способами.

Например, Linux имеет LD_LIBRARY_PATH, а MacOS имеет DYLD_LIBRARY_PATH переменные envinronment. См. Этот вопрос и ответы: Можно ли использовать DYLD_LIBRARY_PATH на Ma c OS X? И что за алгоритм поиска в библиотеке Dynami c? . Кстати, я согласен со многими сообщениями там, что редактирование переменной envinronment - лучший способ разрешить эту ситуацию.

Есть также хорошо известный флаг -Wl,--rpath для компоновщика. Это явно говорит, чтобы добавить путь поиска в файл приложения. Я думаю, что этот метод больше подходит, если вы разработчик и экспериментируете с вашим кодом, прежде чем устанавливать его в нужное место.

Мой ответ на этот вопрос будет таким, что вам следует прочитать руководства. Введите man ld в своем терминале и посмотрите, какие у вас есть варианты.

Обновление

Ну, у меня на Linux загрузчик называется ld.so и компоновщик это ld. Обновление просто для ответа на комментарий.

...