Jos*_*mon 7 c++ linux matlab ld mex
我试图通过MATLAB编译C++ Ubuntu项目在这里.当我尝试使用make命令编译后使用它时,我收到以下错误:
Invalid MEX-file
'////fashionista_v0.2/lib/+bsr/buildW.mexglx':
//local/MATLAB/R2011a/bin/glnx86/../../sys/os/glnx86/libstdc++.so.6: version
`GLIBCXX_3.4.11' not found (required by
////fashionista_v0.2/lib/+bsr/buildW.mexglx)
Run Code Online (Sandbox Code Playgroud)
我不熟悉的过程,所以我不能明白像一些提出的解决方案是.什么是libstdc ++和GLIBCXX,我该如何解决这个问题?
我试图使用nkjt 建议的链接解决问题:
export LD_LIBRARY_PATH=${prefix}/lib:$LD_LIBRARY_PATH
Run Code Online (Sandbox Code Playgroud)
但是,由于缺乏unix shell知识,我不明白在命令中放什么.我找到了libstdc ++ .a和.so文件,它位于gcc文件夹中/usr/lib/gcc/i686-linux-gnu/4.6,我正在尝试以下方法:
export LD_LIBRARY_PATH=/usr/lib/gcc/i686-linux-gnu/4.6:$LD_LIBRARY_PATH
Run Code Online (Sandbox Code Playgroud)
但是,我的matlab错误仍然存在.我正在使用Ubuntu 12.04版本与gcc 4.6和matlab r2011a.
编辑:我已经更新了matlab版本到r2012a问题仍然相同.我也尝试过以下方法:
sudo ln -s /usr/lib/cc/i686-linux-gnu/4.6/libstdc++.so libstdc++.so.6
Run Code Online (Sandbox Code Playgroud)
我无法创建文件已存在的文件.
usr/lib/libstdc ++.so.6 |的输出 grep GLIBC:
GLIBCXX_3.4
GLIBCXX_3.4.1
...
GLIBCXX_3.4.10
GLIBCXX_3.4.11
GLIBCXX_3.4.12
GLIBCXX_3.4.13
GLIBCXX_3.4.14
GLIBCXX_3.4.15
GLIBCXX_3.4.16
GLIBC_2.0
GLIBC_2.3
GLIBC_2.4
GLIBC_2.3.4
GLIBC_2.1
GLIBC_2.1.3
GLIBC_2.3.2
GLIBC_2.2
GLIBCXX_DEBUG_MESSAGE_LENGTH
Run Code Online (Sandbox Code Playgroud)
我怎样才能确保定义了正确版本的libstdc ++?
rub*_*nvb 11
Matlab(还有很多其他商业程序,比如Steam,Mathematica等)都有自己的libstdc ++版本,所以:
/usr/local/MATLAB/R2011a/bin/glnx86/../../sys/os/glnx86/libstdc++.so.6
Run Code Online (Sandbox Code Playgroud)
问题是当你启动matlab时,它首先加载这个,然后加载它,这个版本用于解决所有动态加载器依赖.
您使用系统GCC编译并链接到系统的libstdc ++,这是更新的.结果二进制文件然后请求某个(更新)版本的符号,并且加载器在已经加载的版本(即Matlab)中找不到它们.
有两种方法可以解决这个问题:
1A.删除/重命名Matlab的libstdc ++,并将系统的版本符号链接到完全相同的名称:
sudo rm /usr/local/MATLAB/R2011a/bin/glnx86/../../sys/os/glnx86/libstdc++.so.6
sudo ln -s /usr/lib/x86_64-linux-gnu/libstdc++.so.6 /usr/local/MATLAB/R2011a/bin/glnx86/../../sys/os/glnx86/libstdc++.so.6
Run Code Online (Sandbox Code Playgroud)
1B.删除Matlab的版本,让你的操作系统的加载器拿起系统的libstdc ++:
sudo rm /usr/local/MATLAB/R2011a/bin/glnx86/../../sys/os/glnx86/libstdc++.so.6
Run Code Online (Sandbox Code Playgroud)
1C.使用环境变量LD_PRELOAD将系统的libstdc ++版本"注入"到执行环境中之前的其他任何东西,这会阻止加载旧的Matlab版本:
LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libstdc++.so.6 matlab
Run Code Online (Sandbox Code Playgroud)
update-alternatives)以使用它而不是系统的GCC.请注意,对于1-3,您可能需要以libgcc_s.so相同的方式混淆其他库.
使用新版本的原因是因为libstdc ++内部采用了符号版本控制方案(因此也提到了版本的详细错误消息).需要为例如Arch Linux上的Steam执行类似的"修复",其中几个系统库Steam使用链接到较新的libstdc ++.
真正的解决方案是让Matlab不发布libstdc ++,而是使用操作系统提供的版本.
| 归档时间: |
|
| 查看次数: |
4955 次 |
| 最近记录: |