Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C+中读取MATLAB格式数据文件的正确方法是什么+; 我试图在C++中读取一个Matlab格式化的数据文件(Data .Mat)文件。我参考了下面的帖子“”并尝试了给定的示例代码 using namespace std; int main() { MATFile *pmat; pmat = matOpen("data.mat","r"); return 0; }_C++_Macos_Matlab_Dynamic Linking - Fatal编程技术网

在C+中读取MATLAB格式数据文件的正确方法是什么+; 我试图在C++中读取一个Matlab格式化的数据文件(Data .Mat)文件。我参考了下面的帖子“”并尝试了给定的示例代码 using namespace std; int main() { MATFile *pmat; pmat = matOpen("data.mat","r"); return 0; }

在C+中读取MATLAB格式数据文件的正确方法是什么+; 我试图在C++中读取一个Matlab格式化的数据文件(Data .Mat)文件。我参考了下面的帖子“”并尝试了给定的示例代码 using namespace std; int main() { MATFile *pmat; pmat = matOpen("data.mat","r"); return 0; },c++,macos,matlab,dynamic-linking,C++,Macos,Matlab,Dynamic Linking,从帖子的答案中,我使用以下命令运行示例代码 Command: g++ main.cpp -o out -I/Applications/MATLAB_R2019a.app/extern/include -L/Applications/MATLAB_R2019a.app/extern/lib -lmat Output: ld: library not found for -lmat clang: error: linker command failed with exit code 1 (use

从帖子的答案中,我使用以下命令运行示例代码

Command:
g++ main.cpp -o out -I/Applications/MATLAB_R2019a.app/extern/include -L/Applications/MATLAB_R2019a.app/extern/lib -lmat

Output:
ld: library not found for -lmat
clang: error: linker command failed with exit code 1 (use -v to see invocation)
为了解决这个问题,我将
'mat.h'、'matrix.h'和'tmwtypes.h'
复制到代码目录中。但是,现在当我运行代码时,我得到了一个不同的错误,我无法找到任何解决方案

Command:
g++ main.cpp -o out

Output:
Undefined symbols for architecture x86_64:
  "_matOpen_800", referenced from:
      _main in main-d0f06c.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
谁能帮我一下吗。
我正在使用Mac OS Mojave。谢谢。

我从未在PC上使用过
MacOS
。我甚至不知道
OS
是否在每种设备类型上都使用相同的名称。您在这里看到的是一个运行时链接问题

您将标志传递给链接器,告知链接器在何处查找符号以及将有哪些符号。然后构建二进制文件。但在运行时,
ld
(二进制可执行文件链接器/加载器。它可能与生成特定应用程序的链接器/加载器相同)将在操作系统的标准位置搜索动态符号

正如我所说,我不习惯MacOS。我现在使用Linux。例如,Linux使用
/usr/lib
/usr/local/lib
路径来搜索动态库。
ld
程序搜索符号的方式可以通过几种方式进行配置

例如,
Linux
具有
LD\u库路径
,MacOS具有
DYLD\u库路径
环境变量。请参阅此问题和答案:。顺便说一句,我同意那里的许多帖子,编辑环境变量是解决这种情况的最好方法

链接器还有一个众所周知的
-Wl,--rpath
标志。它明确告诉您向应用程序文件添加搜索路径。我认为,如果您是一名开发人员,并且在将代码安装到适当的位置之前正在对其进行试验,那么这种方法更适合您

我对这个问题的回答是,你应该阅读手册。在终端中键入
man-ld
,查看您的选项

更新


在我的
Linux
中,加载程序名为
ld。因此
和链接器名为
ld
。更新只是为了回答评论。

您应该在问题中添加适当的标签。问题更多地与链接器相关。添加一个操作系统标签会很好。。。我没有投你反对票。确认你可能会看到我现在投的反对票。因此,用户最多只能投两次否决票。最后一个是我的:PDo你有一个
/Applications/MATLAB_R2019a.app/extern/lib/libmat.dylib
?这就是您告诉构建系统要链接到的内容。链接器错误表示此文件不存在。在第二次尝试中,您没有链接到库,因此链接器找不到库中定义的符号。没有,我只有
/Applications/MATLAB_R2019a.app/extern/lib/
中的
maci64
。我遵循了这篇文章(),但后来我发现我的系统中不存在libmat,所以我将头文件复制到了我的工作目录中。但是,由于我包含了存在于同一目录中的头文件,它不应该在编译时链接吗@Crisluengo如果没有库,则无法链接到库。您是否查看了
maci64
目录?我想你可以在那里找到图书馆。如果是这样,您只需调整compile命令中的
-L
选项,使其指向包含
libmat
库的目录。这是编译时链接器错误,而不是运行时错误
ld
是静态编译时链接器
ldd
将是动态运行时链接器(它在MacOS上有不同的名称,但无所谓)。在这两种情况下,
ld
都是静态链接器,OP的错误消息发生在二进制文件的创建过程中,而不是在其运行过程中。告诉别人你正在对其他文件进行降级,这并不明智。主持人可能会注意到并采取行动。@Jean-Françoisfare,他们确实注意到了。下次我就忽略上面的评论。是的,你这样做!(注意我名字旁边的钻石:)