在单独测试我的代码之后,我决定最终将其合并到项目中。问题是,当LabVIEW 2010(SP1,64位)加载自定义DLL时,它将遍历依赖关系并发现最终需要tbb.dll。好吧,据我所知,LabVIEW使用自己的tbb.dll版本。而且它的版本缺少入口点?throw_exception_v4@internal@tbb@@YAXW4exception_id@12@@Z。我之前分别运行过该功能,并且运行良好。 It would appear this is not an unheard of LabVIEW error which hasn't been addressed.

由于这是第三方库的依赖项,因此我要么不能使用MATLAB库并从头制作所有内容,要么可以强制LabVIEW加载tbb.dll的工作版本,这似乎意味着将DLL复制到Windows中。夹。这些都不是可用的解决方案。此外,我们没有Mathscript的许可证。有任何想法吗?

以防万一在修改他们的示例时我做错了什么,我的代码的简化版本如下:

#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <cstring>
#include "mat.h"
#include "createMatFile.h"

export "C" int createMatFile(const char *filename, int* dataArray, int count)
{
    MATFile *pmat;
    mxArray *data;
    mwSize dims[2] = {1,1};

    //Open the file to write to
    pmat = matOpen(filename, "w");
    if (pmat == NULL) {
        printf("Error creating file %s\n", filename);
        printf("(Do you have write permission in this directory?)\n");
        return(EXIT_FAILURE);
    }

    //Convert data to double
    double* dataDouble = new double[count];

    for(int i=0; i<count; i++)
    {
        dataDouble[i] = (double)data[i];
    }

    //Populate the mxArrays
    dataArray = mxCreateDoubleMatrix(1,count,mxREAL);
    memcpy((void *)(mxGetPr(dataArray)), (void *)dataDouble, sizeof(*dataDouble)*count);

    //Put the shape struct in the .mat file
    int status = matPutVariable(pmat, "data", dataArray);
    if (status != 0) {
        printf("%s :  Error using matPutVariable on line %d\n", __FILE__, __LINE__);
        return(EXIT_FAILURE);
    }

    //Clean up
    delete [] dataDouble;
    mxDestroyArray(dataArray);

    //Close the file to write to
    if (matClose(pmat) != 0) {
        printf("Error closing file %s\n",filename);
        return(EXIT_FAILURE);
    }

    return EXIT_SUCCESS;
}

.h文件只是该函数的原型(prototype)。

最佳答案

由于LabVIEW将自己的版本的tbb.dll安装到Windows路径中并进行加载,因此解决该问题的唯一方法是将新的tbb.dll复制到system32文件夹中。这不是一个好的解决方案,因此唯一的答案可能是:

  • 使用此system32 hack可能会导致其他问题。
  • 创建一些技巧以在单独的进程中动态加载适当的DLL,而无需从LabVIEW中加载任何东西,然后从该进程中调用MATLAB DLL,然后将计算出的值返回给LabVIEW进程。由于我的程序仅将数据写入文件,因此它无需将任何内容返回给LabVIEW,从而简化了此选择。
  • 或者只是停止结合使用MATLAB和LabVIEW。
  • 关于c++ - 从LabVIEW调用的DLL中编写MATLAB文件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25919667/

    10-13 07:36