为啥我的代码无法与墨西哥一起构建但与 cl 一起使用?

Posted

技术标签:

【中文标题】为啥我的代码无法与墨西哥一起构建但与 cl 一起使用?【英文标题】:Why does my code fail to buld with Mex but work with cl?为什么我的代码无法与墨西哥一起构建但与 cl 一起使用? 【发布时间】:2020-12-23 12:49:22 【问题描述】:

嘿,所以我正在努力将一块硬件连接到由 MATLAB 控制的设置中。我编写了一组函数(尝试了 C 和 C++),它们利用这个硬件来执行简单的任务。

代码使用 cl 编译得很好。但是,当我尝试使用 mex 编译时,它似乎无法链接我的包含中的符号(我正在使用指向我的头文件目录的 -I 标志)。

有什么想法吗?

CL 输出:

>cl isConnected.c *.lib
Microsoft (R) C/C++ Optimizing Compiler Version 19.28.29334 for x86
Copyright (C) Microsoft Corporation.  All rights reserved.

isConnected.c
Microsoft (R) Incremental Linker Version 14.28.29334.0
Copyright (C) Microsoft Corporation.  All rights reserved.

/out:isConnected.exe
isConnected.obj
ArenaCd_v140.lib
ArenaC_v140.lib
isConnectedMex.lib
SaveCd_v140.lib
SaveC_v140.lib

MATLAB 输出:

>> curDir = pwd;
>> linkPath = ['-L' fullfile(curDir,'\lib64\ArenaC\ArenaC_v140.lib')];
>> incPath = ['-I' fullfile(curDir,'\include\ArenaC')];
>> exist(linkPath(3:end))
ans = 2
>> exist(incPath(3:end))
ans = 7
>> % Paths Are Correctly named it seems
>> mex('isConnectedMex.c',incPath,linkPath)
Building with 'Microsoft Visual C++ 2019 (C)'.
Error using mex
   Creating library isConnectedMex.lib and object isConnectedMex.exp
isConnectedMex.obj : error LNK2019: unresolved external symbol __imp_acOpenSystem referenced in function main
isConnectedMex.obj : error LNK2019: unresolved external symbol __imp_acGetLastErrorMessage referenced in function main
isConnectedMex.obj : error LNK2019: unresolved external symbol __imp_acSystemUpdateDevices referenced in function main
isConnectedMex.obj : error LNK2019: unresolved external symbol __imp_acSystemGetNumDevices referenced in function main
isConnectedMex.mexw64 : fatal error LNK1120: 4 unresolved externals

MATLAB 错误引用的函数在我的一个标题中是#include。将 -v 选项与 MEX 一起使用,尽管它显示这些文件夹已包含在内。任何帮助将非常感谢!

编辑:添加使用的 cl 和 mex 命令。 isConnected.c 和 isConnectedMex.c 之间的唯一区别是 isConnectedMex.c 使用 mexFunction 调用作为它的主要方法。

【问题讨论】:

没问题,我刚刚更新它以显示这些。 【参考方案1】:

-L 选项用于指定链接器可以在其中找到所需库文件的目录。您需要使用-l 选项(小写L)来指定要链接的库。这是它的样子:

mex isConnectedMex.c -Iinclude\ArenaC -Llib64\ArenaC -lArenaC_v140

或者,如果 lib 文件是静态库,您可以将其作为输入文件传递:

mex isConnectedMex.c lib64\ArenaC\ArenaC_v140.lib -Iinclude\ArenaC

【讨论】:

是的!非常感谢。这么简单的答案。太沮丧了,甚至无法清楚地思考。你成就了我的一天:D

以上是关于为啥我的代码无法与墨西哥一起构建但与 cl 一起使用?的主要内容,如果未能解决你的问题,请参考以下文章

sklearn:无法使 OneHotEncoder 与 Pipeline 一起使用

为啥将 %dopar% 与 foreach 一起使用导致 R 无法识别包?

外键约束不通过程序工作。但与终端一起工作

JAVA - Apache BEAM- GCP:GroupByKey 与 Direct Runner 一起工作正常,但与 Dataflow runner 一起失败

Mandrill / Mailchip 设计电子邮件与 mandrill_send 一起使用,但与 Sidekiq 一起失败

在 C 中编辑不可变字符串 - 与旧编译器一起使用,但与现代编译器中断