Недавно я переустановил 32-разрядную версию CPLEX на новый Ubuntu 16.04. Когда я скомпилирую следующую тестовую программу с g ++ - 5.4, она сработает с segfault.Ошибка сегментации в CPXopenCPLEX
#include "cplex.h"
#include <iostream>
using namespace std;
int main() {
int err;
cout << "CPX_VERSION: " << CPX_VERSION << endl << flush;
CPXENVptr env_ = CPXopenCPLEX(&err);
cout << "error: " << err << endl << flush;
if (env_) {
cout << "has env" << endl;
}
return 0;
}
Я скомпилировал с помощью следующего вызова
g++ -m32 main.cpp -o main /path/to/cplex/lib/x86_linux/static_pic/libcplex.a -lpthread -I/path/to/cplex/include/ilcplex/
Выход
CPX_VERSION: 12060300
[1] 21609 segmentation fault (core dumped) ./main
Любые предложения о том, как исправить или отладки это приветствуются.
Edit: В 64-битной версии работы (без флага компилятора -m32
и используя x86-64_linux
вместо x86_linux
на пути к библиотеке, конечно). Но это не решает мою проблему, так как мне нужна 32-битная версия.
Редактировать 2: Мне удалось получить рабочую версию на другом компьютере, который также работает на моем компьютере (я думаю, что это причина исключения общих библиотек в качестве возможного источника). Я сравнивал вывод strace обоих двоичных файлов, и они были почти идентичны вплоть до ошибки. Различия заключались в значениях конкретных указателей и порядке строк на выходе (вероятно, только проблема с выходным буфером, а не реальная разница). Рабочая версия делает два звонка на time(NULL)
на месте были другие версии segfaults. Поскольку это первый вызов time
на выходе, это может быть проблемой.
«как отлаживать» - gdb. – UKMonkey
Я не мог получить полезный вывод из gdb, потому что CPLEX является закрытым. Все, что я вижу из gdb, - это то, что segfault возник в CPXopenCPLEX. @UKMonkey: можете ли вы рассказать мне более подробно, как использовать gdb в этом случае? – Flogo
Ну, варианты, которые я вижу, это: 1. Harass IBM 2. попробуйте 64-битную сборку cplex и посмотрите, что произойдет (так как ваша машина 64-разрядная, возможно, возникают проблемы с размещением разделяемых библиотек, которые она хочет?) I вероятно, рассмотрит №1, поскольку нет ничего явно неправильного, хотя я не читал всю документацию IBM для этой функции. – UKMonkey