CPXopenCPLEX 中的分段错误

Segmentation Fault in CPXopenCPLEX

我最近在新的 Ubuntu 16.04 上重新安装了 32 位版本的 CPLEX。当我用 g++-5.4 编译以下测试程序时,它因段错误而崩溃。

#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

欢迎就如何修复或调试此问题提出任何建议。

编辑: 64 位版本有效(当然,没有编译器标志 -m32,并且在库的路径中使用 x86-64_linux 而不是 x86_linux)。但这并不能解决我的问题,因为我需要 32 位版本。

Edit2: 我能够在另一台计算机上获得工作版本,该版本也在我的计算机上运行(我认为这是排除共享库作为可能来源的原因).我比较了两个二进制文件的 strace 输出,在出现错误之前它们几乎完全相同。不同之处在于特定的指针值和输出中的行顺序(可能只是输出缓冲区的问题,并不是真正的区别)。 工作版本在其他版本出现段错误的地方对 time(NULL) 进行了两次调用。由于这是输出中对 time 的第一次调用,因此这可能是问题所在。

我在 IBM forums 中问过这个问题,最终结果似乎是,这可能是旧 CPLEX 版本与新 32 位 binutils 版本不兼容。由于 IBM 在下一个 CPLEX 版本中停止支持 32 位构建,因此几乎没有机会修复此错误。