2016-10-06 8 views
2

Недавно я переустановил 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 на выходе, это может быть проблемой.

+0

«как отлаживать» - gdb. – UKMonkey

+0

Я не мог получить полезный вывод из gdb, потому что CPLEX является закрытым. Все, что я вижу из gdb, - это то, что segfault возник в CPXopenCPLEX. @UKMonkey: можете ли вы рассказать мне более подробно, как использовать gdb в этом случае? – Flogo

+0

Ну, варианты, которые я вижу, это: 1. Harass IBM 2. попробуйте 64-битную сборку cplex и посмотрите, что произойдет (так как ваша машина 64-разрядная, возможно, возникают проблемы с размещением разделяемых библиотек, которые она хочет?) I вероятно, рассмотрит №1, поскольку нет ничего явно неправильного, хотя я не читал всю документацию IBM для этой функции. – UKMonkey

ответ

0

Я задал этот вопрос в IBM forums, и, как представляется, конечный результат заключается в том, что это, вероятно, несовместимость старой версии CPLEX и новой 32-разрядной версии binutils. Поскольку IBM перестала поддерживать 32-битные сборки в следующей версии CPLEX, нет никаких шансов, что эта ошибка когда-либо будет исправлена.