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 位构建,因此几乎没有机会修复此错误。
我最近在新的 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 位构建,因此几乎没有机会修复此错误。