处理八度和墨西哥问题的初学者

Posted

技术标签:

【中文标题】处理八度和墨西哥问题的初学者【英文标题】:Beginner grappling with octave and mex issues 【发布时间】:2015-07-03 19:30:49 【问题描述】:

我是一位经验丰富的 C/C++ 开发人员,但在处理 octave 中的 mex 时,我是非常绿色的。我确定我在这里遗漏了一些基本的东西,但我找不到它是什么。

这些是我的文件:

myhello.cpp   
test.cpp   
test.h

这是文件的内容

(myhello.cpp):

#include "test.h"
#include "mex.h"

using namespace test;

void
mexFunction (int nlhs, mxArray *plhs[],
             int nrhs, const mxArray *prhs[])

  mexPrintf ("Hello, World!\n");
  testMethod();

  mexPrintf ("I have %d inputs and %d outputs\n", nrhs, nlhs);

(test.h)

namespace test

        void testMethod();

(test.cpp)

#include "test.h"
#include <iostream>

using namespace std;
using namespace test;

void testMethod()

        cout << "this works." << endl;

然后我通过 ./run-octave --no-gui 启动 Octave 4.0.0,并在提示符下键入以下内容:

mex -v myhello.cpp test.cpp

我得到的回应是:

g++ -c -fPIC -I/usr/local/include/octave-4.0.0/octave/.. -I/usr/local/include/octave-4.0.0/octave -I/usr/local/include -pthread -fopenmp -g - O2-I。 myhello.cpp -o myhello.o g++ -c -fPIC -I/usr/local/include/octave-4.0.0/octave/.. -I/usr/local/include/octave-4.0.0/octave -I /usr/local/include -pthread -fopenmp -g -O2 -I。 test.cpp -o test.o g++ -shared -Wl,-Bsymbolic -o myhello.mex myhello.o test.o -L/usr/local/lib/octave/4.0.0 -L/usr/local/lib - loctinterp -loctave

我再次看到提示。

我输入

我的你好(1,2,3)

得到这个:

错误:/home/brush/Documents/mex_tests/myhello.mex:加载失败: /home/brush/Documents/mex_tests/myhello.mex:未定义符号: _ZN4test10testMethodEv

所以显然有些东西没有正确链接,但我不知道如何让所有东西都这样做。抱歉,但我已经搜索了一段时间,但没有找到任何解决这个简单问题的方法。

提前致谢, 本

附:我的系统是 Ubuntu 15.04,64 位。

【问题讨论】:

试试-v看看有没有更多线索。此外,这是一个很长的镜头,但请尝试将#include "mex.h" 放在首位。就好像它认为testMethod 是外部的……或者是动态加载的。 等等,void testMethod() 不应该在 namespace test 的 test.CPP 中定义吗? @chappjc 我在代码中遇到了一些奇怪的奇怪错误(我通常在 Microsoft Visual Studio 中工作),但要让 mex 编译,我必须在开头包含命名空间test.cpp 文件,然后定义函数。 【参考方案1】:

除非我在namespace test 中定义void testMethod(),否则我什至无法在VS2013 中编译(实际上是链接)。这有效:

//test.cpp
#include "test.h"
#include <iostream>

using namespace std;

namespace test

    void testMethod()
    
            cout << "this works." << endl;
    

没有namespace test ... ,有未解析的符号:

myhello.obj : error LNK2019: unresolved external symbol "void __cdecl test::testMethod(void)"

当它起作用时,我得到:

>> myhello
Hello, World!
I have 0 inputs and 0 outputs

【讨论】:

嗯,这正是我最初所做的,但要么是有一个奇怪的语法错误,要么是 mex 没有接受它;它一直在抱怨另一个问题……我现在不在,但会稍微回复一下细节。 FWIW,我一直在用我最近下载的其他一些代码来解决这个完全相同的类似链接器的错误。这就是我创建这个简单程序的原因。 @Ben OK,但是没有在 test 命名空间中定义它,会有未解析的符号。我在构建时获取它们,而您在运行时获取它们。不知道为什么。程序的输出是正确的。 这也是我的理解。我会再试一次。也许我只是做了一些愚蠢的事情?我在 VIM 中执行此操作,因此我可能已经习惯了智能感知和 VS 的红色波浪线 :) 我假设自从它编译和链接后,它就可以工作了……也许 mex 的工作方式不同。跨度> @Ben 我不会怪你——如果没有智能感知提供的命令完成,我几乎无法编程。顺便说一句,stdout 通常不是 MATLAB 命令提示符,因此 cout 可能不可见。 嗯……我猜我脸上有鸡蛋。我做了我认为我之前对代码所做的事情(如您在上面显示的),这次它起作用了。大概我之前试图开始工作的代码有同样的怪癖(我在它之后建模了这段代码,试图隔离没有编译的代码)。我想谢谢是为了。

以上是关于处理八度和墨西哥问题的初学者的主要内容,如果未能解决你的问题,请参考以下文章

最小值和最大值的八度代码以及查找索引

Java noobie:for循环调用方法不起作用

Python 初学者必看:Python 异常处理集合

五线谱高低八度标记 ( 高八度标记 | 标记范围的音符整体提升一个八度 | 低八度标记 | 标记范围的音符整体降低一个八度 )

单片机初学者编程经常会碰到的问题及处理办法

(SQL 初学者问题)帮助理解 HAVING 和 GROUP BY 是如何应用的