• Windows10 + Matlab2013 mex C++ 调用gsl


    最前面啰嗦一句,matlab默认编译c的编译器有点奇怪,会出现引用.h却找不到相应函数的问题,解决方法是把.c全部都改成.cpp!血的教训!

    下面进入正题~~

    由于Matlab调用的C函数中引用了GSL,编译了半天,改来改去,每次都提示LNK error找不到gsl:

    em.obj : error LNK2019: 无法解析的外部符号 "void __cdecl readData(char *,struct Dataset *)" (?readData@@YAXPEADPEAUDataset@@@Z),该符号在函数 main 中被引用 ...

    经过长时间的google search,终于有一哥们儿的回答让我眼前一亮!!

    http://www.mathworks.com/matlabcentral/newsreader/view_thread/168083

    特附上网址一枚~~~

    贴上这个让我感动得要掉眼泪的回复:

    所以下面的步骤就是:

    1.编译64位的gsl,可以参考http://blog.sina.com.cn/s/blog_6e0693f70100u2ve.html 我是偷了懒,直接在csdn上找到了编译好的现成的gsl-64

    2.改mexopt对应的INCLUDE和LIB (这一步其实可以省略,亲测并不影响),也就是上一篇博客中提到的设置INCLUDE和LIB的方法,可以直接通过mex的参数来指定,见3

    3.编辑编译命令,我最后的编译命令是:

     mex em_mex.cpp em.cpp data.cpp prob_functions.cpp -LD:sdksgsl-64lib -ID:sdksgsl-64include -llibgsl-0 -llibgslcblas-0

    稍微解释一下,-L是指定库目录,-I是指定包含目录,-l是指定依赖的库文件,只需要文件名,不需要添加.lib后缀。特别注意的是,这些选项和值之间不要加空格,具体可以使用help mex在Matlab中查看用法。

    终于,经过长途跋涉,使用这条命令编译后,梦寐以求的xxxx.mexw64出现了!

    下面。。我要和Matlab中调用函数类型出错来抗争了!!

    Undefined function 'XXXX' for input arguments of type 'double'.

    God bless me~~~

    ==== 更新 ====

    上面这个Undefined function,是我2了,忘记把包含那个函数的路径加到Matlab中去,下次记得了~~( ̄▽ ̄)"

  • 相关阅读:
    P5664 Emiya 家今天的饭
    P3944 肮脏的牧师
    P1233 木棍加工
    P4017 最大食物链计数
    P1287 盒子与球
    Java之未来已来(1)
    java-信息安全(二)-对称加密算法DES,3DES,AES,Blowfish,RC2,RC4
    java-信息安全(一)-BASE64,MD5,SHA,HMAC,RIPEMD算法
    SpringBoot集成Caffeine作本地缓存
    联想拯救者-触摸板手势
  • 原文地址:https://www.cnblogs.com/zhsuiy/p/4793104.html
Copyright © 2020-2023  润新知