Компоновщик MinGW не может найти библиотеки MPICH2 - PullRequest
4 голосов
/ 28 августа 2009

MPICH2 установлен в C: \ Program Files \ MPICH2. Существует два подкаталога (представляющих интерес): \include, который содержит файлы .h, и \lib, который содержит файлы .lib.

Readme, поставляемый с MPICH2, имеет следующие инструкции:

  1. создать make-файл
  2. добавить –I...mpich2\include
  3. добавить –L...mpich2\lib
  4. добавить –lmpi
  5. добавить правила для ваших исходных файлов
  6. компилировать

Поскольку в моем проекте нет других правил, я не создаю make-файл, я просто захожу в командную строку и пытаюсь скомпилировать так:

g++ -I"C:\Program Files\MPICH2\include" main.cpp -L"C:\Program Files\MPICH2\lib" -lmpi

Это дает мне пригоршню undefined reference ошибок на каждый символ MPI в коде. Я часами пытался это исправить, жонглируя переключателями -I, -L и -l, перетасовывая порядок параметров, даже копировал все файлы .lib в тот же каталог, что и мой источник, но, похоже, ничего не работает .

Какой тип вуду нужен, чтобы связать эту штуку?


РЕДАКТИРОВАТЬ: я думаю, что я нашел проблему: вот выдержка из вывода компоновщика в подробном режиме (добавление -Wl,--verbose к команде компиляции):

attempt to open C:\Program Files\MPICH2\lib/libmingwex.dll.a failed
attempt to open C:\Program Files\MPICH2\lib/mingwex.dll.a failed
attempt to open C:\Program Files\MPICH2\lib/libmingwex.a failed
attempt to open C:\Program Files\MPICH2\lib/mingwex.lib failed
attempt to open C:\Program Files\MPICH2\lib/libmingwex.dll failed
attempt to open C:\Program Files\MPICH2\lib/mingwex.dll failed
attempt to open C:\Program Files\MPICH2\lib\libmingwex.a failed

Очевидно, компоновщик добавляет / вместо \ к именам каталогов, которые я ему предоставляю (за исключением случаев, когда по какой-то причине ищется формат lib___.a), что, очевидно, не является допустимым путем. Можно ли указать компоновщику использовать обратную косую черту вместо косой черты?

Это также привлекло мое внимание:

attempt to open /mingw/lib/libmingwex.a succeeded

Итак, я попытался скомпилировать так:

g++ -I"/Program Files/MPICH2/include" -L"/Program Files/MPICH2/lib" objManager.cpp ongom.cpp io.cpp main.cpp -lmpi -lcxx

Но я все равно получаю те же undefined reference ошибки.

Ответы [ 4 ]

3 голосов
/ 21 сентября 2012

GCC может найти вашу библиотеку. В противном случае он сообщит: cannot find -lmpi.

Как-то так получается, что процедуры не могут быть найдены в этой библиотеке. Мне удалось скомпилировать пример с таким синтаксисом:

g++ -I../include cpilog.c ../lib/mpi.lib ../lib/mpe.lib

Я сделал это внутри msys. И мой каталог не содержит пробелов.

После удаления файла libmpi.a это также работает:

g++ -I../include -L../lib cpilog.c -lmpi -lmpe
1 голос
/ 11 февраля 2013

У меня была похожая проблема, возникающая из-за связывания 32-битных объектных файлов с 64-битной библиотекой MPICH. Связывание с 32-битным libmpi.a решило проблему.

1 голос
/ 29 августа 2009

попробуйте добавить -lmpicxx (библиотека для привязок c ++) и убедитесь, что -l... идет после исходного файла cpp *. это работает для меня:

g++ -Iinclude -Llib test/cxxpi.cpp -lmpicxx -lmpi

РЕДАКТИРОВАТЬ: re: "неопределенная ссылка на 'MPI_Comm_rank'": может быть, вы смешиваете / используете c и / вместо c ++? MPI_Comm_rank представляется привязкой c - привязка c ++ будет MPI::Comm::Get_rank(). возможно, попробуйте скомпилировать вашу программу как c или, если вы хотите использовать c ++, используя правильные привязки (см. cxxpi.cpp в примерах dir)?

* http://newsgroups.derkeiler.com/Archive/Comp/comp.parallel.mpi/2006-08/msg00036.html

0 голосов
/ 31 августа 2009

У меня была похожая проблема с mingw: для тех библиотечных файлов с окончанием .lib мне приходилось указывать имя библиотеки без конца (например, -llibboost_system-mgw34-mt, когда имя файла - libbboost_system-mgw34-mt .lib). Для библиотечных файлов с окончанием .a мне пришлось указать имя библиотеки, исключая начальную "lib" и конечный .a (например, -lws2_32 для libws2_32.a).

Так что в вашем случае - попробуйте -llibmpi (или как там ваш файл называется без окончания .lib), возможно, это та же проблема.


от: http://www.mingw.org/node/98/revisions/358/view

Примечание: некоторые пути были напечатаны с «/» в качестве разделителя пути, а некоторые другие были напечатаны с «\» в качестве разделителя пути. Я заменил все на «/», так как MinGW GCC принимает оба.

Так что я бы не стал слишком долго искать способ исправить разделитель пути. Ваша библиотека скомпилирована для mingw?

возможно: http://www.mingw.org/wiki/LibraryPathHOWTO поможет вам немного дальше.

...