2015-11-11 3 views
0

Я хотел бы знать, как связать скомпилированный код pgC++ (blabla.a) с основным кодом, скомпилированным с компилятором C++ или g ++ GNU. На данный момент, связывающем с невыполнением Gnu C++ линкер дает ошибку, как: неопределенной ссылка на `__pgio_initu»Связывание скомпилированной библиотеки pgi с gcc-компоновщиком

компиляторов

ответ

3

Как уже указывал предыдущий человек, PGI поддерживает использование имени G ++ при использовании команды pgc++. Судя по этому результату, я предполагаю, что вы связываетесь с g ++, а не с pgC++. У меня был наибольший успех при использовании pgC++ в качестве компоновщика, чтобы он нашел библиотеки PGI. Если это не вариант, вы можете связать исполняемый файл с pgc++ -dryrun, чтобы получить полную линию ссылок и за пределами опций -L и -l, чтобы получить те же библиотеки.

+0

спасибо, что это сработало. –

+0

@MedAissa Не могли бы вы отметить этот ответ в качестве решения для тех, кто случайно ищет эту же проблему в будущем? Благодарю. – jefflarkin

0

Различных C++ использовать различные name-mangling конвенций генерировать имена, которые они выставляют линкер, поэтому имя функции члена int A::foo(int) будет излучаться в компоновщик компилятором A в виде одной строки из goobledegook, а компилятором B в виде совершенно другой строки goobledegook, , и компоновщик не знает, что они ссылаются на ту же функцию. Следовательно вы не можете связать объектные файлы, созданные различными компиляторами C++, если они не использовать те же имя-коверкая конвенции (и вполне возможно, даже не то:. Имя-коверкая только один аспект ABI совместимости)

Это указано в соответствии с this document, PGC++ поддерживается совместимость с gGC 3 года назад, при условии, что компилятор PGI C++ был вызван именно с помощью команды pgc++ или pgcpp --gnu. Возможно, библиотека, с которой вы работаете, не была построена таким образом или, возможно, была построена с использованием более старого компилятора PGI C++.

Во всяком случае, если г ++ компилирует заголовки вашего blabla.a и выделяет различные символы из них в blabla.a, вы не можете связать г ++ код с blabla.a. Вам нужно будет перестроить blabla.a с g ++, что, возможно, не является вариантом.

Смежные вопросы