zoukankan      html  css  js  c++  java
  • 混合编程:error LNK2001: unresolved external symbol

    Vs2006+matlab2010rb环境:

    1:工具-选项-项目解决方案-VC++目录设置include和lib的路径

    2:项目-属性-属性配置-链接器-输入-附加依赖项把库的名字添加进去

    VISTA+MATLAB2009a+VS2010

    以安装路径“E:Program FilesMATLABR2009a”为例

    MATLAB外部支持文件夹:
    E:Program FilesMATLABR2009aextern
    matlab自带的c例程:
    E:Program FilesMATLABR2009aexternexampleseng_mat

    engine.h的位置:
    E:Program FilesMATLABR2009aexterninclude

    各种lib的位置:
    E:Program FilesMATLABR2009aexternlibwin32microsoft

    在matlab帮助中输入“C language”即可找到有关MATLAB Engine的一个页面。
    从这个页面开始,学习各种关键词,
    就能够找到一切你需要的资料。

    使用MATLAB Engine一般用两套函数就可以了。
    1.engXXXX,关于Engine本身的操作,包括打开/关闭,设置/取得变量,执行语句等等。
    2.mxXXXX,关于数据类型mxArray的操作,与MATLAB交互的左右类型全部为mxArray。

    》》一个搭建实例

    先在VS2010的 项目->属性-> VC++目录->包含目录 下加上:

    include files:
    E:Program FilesMATLABR2009aexterninclude

    项目->属性-> VC++目录->库目录 下加上

    library files:
    E:Program FilesMATLABR2009aexternlibwin32microsoft

    做好这些后,如果我们环境一样,
    下面的代码应该能够编通并且正常执行,
    其中包含了常用的一些函数,
    一般来说使用Engine的时候也就用这些了。

    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>

    #include "engine.h"
    #include "matrix.h"

    #pragma comment(lib,"libeng.lib") 
    #pragma comment(lib,"libmx.lib")

    int main()
    {
        Engine *ep;
        int i , j ;

        //show how to open MATLAB engine
        //for remote ones:
        //engOpen( ADDRESS OF REMOTE SYSTEM ) ;

        if (!(ep = engOpen(""))){
            fprintf(stderr, " Can't start MATLAB engine ");
            return EXIT_FAILURE;
        }

        //show how to create matrix
        mxArray *Y = mxCreateDoubleMatrix(1 , 3 , mxREAL) ;
        
        //show how to put data in matrix
        double tmp[3] = {1.0 , 2.0 , 3.0} ;
        memcpy(mxGetPr(Y) , tmp , sizeof(tmp)) ;

        //show how to put variables in the Engine
        engPutVariable(ep , "Y" , Y) ;

        //show how to execute commands in MATLAB
        engEvalString(ep, "X = ones(5,1) * Y");
        
        //show how to get variables from the Engine
        mxArray *X = engGetVariable(ep , "X") ;
        
        //show how to manipulate dimensions
        int dims[10] ;
        int ndims ;
        ndims = mxGetNumberOfDimensions(X) ;
        printf("total number of dimensions is %d " , ndims) ;
        memcpy(dims , mxGetDimensions(X) , ndims * sizeof(int)) ;
        for ( i = 0 ; i < ndims ; i ++ ){
            printf("dimension %d : %d " , i , dims[i]) ;
        }
        printf(" ") ;

        //show how the data is stored in the memory
        double *p = (double*)mxGetData(X) ;    
        for ( i = 0 ; i < dims[0] ; i ++ ){
            for ( j = 0 ; j < dims[1] ; j ++ ){
                printf("%8.2f" , p[j * dims[0] + i]) ;
            }
            printf(" ") ;
        }

        //---important, to release resources
        mxDestroyArray(X) ;
        mxDestroyArray(Y) ;

        //show how to hide and unhide MATLAB command window
        printf("type RETURN to hide the MATLAB command window... ") ;
        getchar() ;
        engSetVisible(ep , false) ;
        printf("type RETURN to unhide the MATLAB command window... ") ;
        getchar() ;
        engSetVisible(ep , true) ;

        printf("type RETURN to END this program... ") ;
        getchar() ;    
        //remembering to close it is important .
        //but if you are debugging your programs , 
        //annotate the following line will save you a lot of time ,
        //for you needn't to restart the Engine .
        engClose(ep) ;
        
        //when your work is accomplished , type "exit" in MATLAB command window

        return EXIT_SUCCESS;
    }


    》》某些问题

    如果出现这个:

    engdemo.obj : error LNK2001: unresolved external symbol _engClose
    engdemo.obj : error LNK2001: unresolved external symbol _engSetVisible
    engdemo.obj : error LNK2001: unresolved external symbol _mxDestroyArray
    engdemo.obj : error LNK2001: unresolved external symbol _mxGetData
    engdemo.obj : error LNK2001: unresolved external symbol _mxGetDimensions_730
    engdemo.obj : error LNK2001: unresolved external symbol _mxGetNumberOfDimensions_730
    engdemo.obj : error LNK2001: unresolved external symbol _engGetVariable
    engdemo.obj : error LNK2001: unresolved external symbol _engEvalString
    engdemo.obj : error LNK2001: unresolved external symbol _engPutVariable
    engdemo.obj : error LNK2001: unresolved external symbol _mxGetPr
    engdemo.obj : error LNK2001: unresolved external symbol _mxCreateDoubleMatrix_730
    engdemo.obj : error LNK2001: unresolved external symbol _engOpen

    其实就是lib没有添加好。

    在代码中写上:
    #pragma comment(lib,"libeng.lib") 
    #pragma comment(lib,"libmx.lib")
    就可以了。

    PS: #pragma comment( comment-type ,["commentstring"] )

    comment-type是一个预定义的标识符,指定注释的类型,应该是compiler,exestr,lib,linker之一。

    commentstring是一个提供为comment-type提供附加信息的字符串。

    我们经常用到的是#pragma comment(lib,"*.lib")这类的。#pragma comment(lib,"Ws2_32.lib")表示链接Ws2_32.lib这个库。 和在工程设置里写上链入Ws2_32.lib的效果一样,不过这种方法写的 程序别人在使用你的代码的时候就不用再设置工程settings了

    或者可以在工程的连接设置里面添加这两个库。
    不过我倾向于前者,这样在发布源码的同时,
    就尽最大可能地保证能够编译,
    而不用其他人学习的时候再去设置。

    当然,由于#pragma是由编译器自己决定的,
    所以代码的可移植性存在一些问题。

    如果还是报上面的错误,估计是没有将lib的路径添加对。
    具体参考上面的那个实例,然后注意把路径换成自己机器上的。

  • 相关阅读:
    spring data jpa 自定义sql 左链接查询
    添加用户具有root权限
    windows rabbitmq 安装
    mongodb 启动
    windows 下杀死tomcat进程
    配置ZooKeeper集群11
    配置ZooKeeper集群
    jquery 上传回显图片预览
    Python internals: Symbol tables, part 1(转)
    Python 学习笔记
  • 原文地址:https://www.cnblogs.com/fickleness/p/3152086.html
Copyright © 2011-2022 走看看