【问题标题】:Mex - Executing command 'which gcc' hangsMex - 执行命令“哪个 gcc”挂起
【发布时间】:2015-10-30 03:40:59
【问题描述】:

我在编译 .c mex 文件时遇到问题。特别是,我无法判断它是否需要很长时间才能编译(这是一个非常大的程序,大约 60MB 的代码),或者它是否配置错误或有其他问题。

我在 Ubuntu 12.04 64 位、MATLAB 2015a 上,配置了 gcc。我的 c 文件叫 test4.c。

所以,我跑了:

mex -v test4.c

Verbose mode is on.
Neither -compatibleArrayDims nor -largeArrayDims is selected.
     Using -compatibleArrayDims. In the future, MATLAB will require the use of
     -largeArrayDims and remove the -compatibleArrayDims option.
     For more information:
     http://www.mathworks.com/help/matlab/matlab_external/upgrading-mex-files-to-use-64-bit-api.html.
... Looking for compiler 'gcc' ...
... Executing command 'which gcc' ...

这就是我所得到的。如果它正在做更多的事情,我会期望详细模式会打印它。

正在编译吗?我怎么知道?为什么会卡在这里(以及“哪个 gcc”在做什么?

【问题讨论】:

    标签: matlab gcc compilation mex


    【解决方案1】:

    命令which gcc 通常只会告诉您gcc 安装在您的系统上的什么位置,这应该相当快。您可以自己从 shell 中尝试以确认:

    pax> which gcc
    /usr/bin/gcc
    

    因此,如果这实际上需要很长时间才能完成,我会感到非常惊讶。

    找出答案的最好方法可能是打开一个终端并输入命令,将您的用户名放在它有<user>的位置:

    ps -fu<user> >/tmp/pslist.txt
    

    就我而言,应该是ps -fupax

    这将为您提供所有进程的列表,然后您可以使用它来跟踪树中当前正在运行的进程,例如:

    UID        PID  PPID  C STIME TTY          TIME CMD
    pax       3103  3099  0 11:42 pts/0    00:00:00 bash
    pax       3137  3103  0 11:48 pts/0    00:00:00 ps -f
    

    首先找到mex -v test4.c 进程(在CMD 下)并获取它的进程ID (PID)。从那里,您可以在父进程 ID (PPID) 字段中查找具有相同编号的所有进程。在我上面的例子中,bash 进程是ps 的父进程。

    如果您沿着树向下走得足够远,您会发现错误的过程。假设它的寿命相对较长,当检查 ps 输出时,它仍然存在 20 秒(例如) - 它也更有可能消耗更多 CPU 时间,因此您可以查看 TIME 列对于非零条目。

    【讨论】:

    • 对不起,我有点困惑。我如何知道进程是否错误?我还应该注意,我刚刚运行了这个,奇怪的是,MATLAB 没有列出。这应该列出所有进程,对吗?我只得到: ps -f UID PID PPID C STIME TTY TIME CMD 1000 6369 3261 0 16:50 pts/4 00:00:00 bash 1000 7942 6369 0 20:56 pts/4 00:00:00 ps -f
    • @user650261,错误的进程很可能是树底部的那个(不是任何其他的父进程),假设它在那里有相当长的 CPU 时间(你可以使用TIME 字段来确定)。至于另一件事,我已经更新了答案。
    • 谢谢。基于此,我得到如下输出:“/usr/lib/gcc/x86_64-linux-gnu/4.7/cc1 -quiet -I /usr/local/MATLAB/R2015a/extern/include... (更多的参数)”从这里,我认为这意味着它处于编译过程的中间(因此必须超过“哪个”)。这种怀疑正确吗?
    • @user650261,我想是的。理想情况下,30 秒后执行相同的ps 命令,然后查看该 PID 是否仍然存在。如果是这样,这是一个很长的编译。如前所述,您还可以检查TIME 列,看看它是否占用了大量的 CPU 时间。
    • 谢谢。我已将其范围缩小到 gcc,所以我将开始一个专门关于 gcc 的新问题。如果/当我取得进展时,我会回到这里。
    猜你喜欢
    • 2021-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多