Код C, использующий blas, lapack и openmp, работающий с gcc 4.9, но выдающий ошибку времени выполнения с gcc 6

Я написал код на C.

Вы можете найти исходный код здесь.

Он использует библиотеки blas, lapack и openmp.

Я собрал библиотеки blas и lapack, следуя этим инструкциям.

Я использую эти флаги, чтобы сообщить компилятору библиотекам, на которые он должен ссылаться: -lblas -llapack -fopenmp,

Я использовал gcc 4.9 и программа может работать правильно.

Недавно я обновил gcc до gcc 6, и он показывает много предупреждающих сообщений о неявном объявлении функций blas и lapack:

src/PSIRWLS-train.c:152:17: warning: implicit declaration of function 'dgemm_' [-Wimplicit-function-declaration]
                 dgemm_(&trans, &trans, &(dataset.l), &ncols, &size,&factorA, KSC, &(dataset.l), miZ, &size, &factor, miKSM, &(dataset.l));

И когда я запускаю приложение, появляется ошибка ошибки сегментации.

Я совершенно заблудился из-за различий в gcc 4.9 и gcc 6, знаете ли вы какие-либо объяснения по этому поводу?

2 ответа

Решение

Задача решена.

1 - Некоторые флаги по умолчанию отличаются в gcc 4 и 6. gcc 6 показывает предупреждения, когда вы не объявляете функции blas и lapack следующим образом:

внешняя пустота dgemm _ (...)

2 - это отпугнуло меня инициализацией одной переменной, которую нужно было инициализировать до 0. Я закодировал int i,j = 0; когда мне нужно было кодировать int i = 0, j = 0;

gcc 4 инициализировал i в 0 (и программа работала правильно), а gcc 6 - нет (создавая ошибку сегментации, потому что эти переменные должны были индексироваться)

Однажды у меня была похожая проблема, и кажется весьма вероятным, что в вашем коде есть неопределенное поведение (например, двойное освобождение), которое обрабатывается специфичным для компилятора образом. Возможно, это изменилось между gcc 4.9 и 6.0.

Трудно сказать, не зная вашего кода, но вы можете сами использовать ряд инструментов для отслеживания этой проблемы, например, GDB или особенно memcheck от valgrind (отлично сработал для меня):

valgrind --tool memcheck <your binary here>

Это будет сообщать о местах ошибок памяти и неопределенного поведения в вашем коде.

Другие вопросы по тегам