为什么我的代码无法使用 Mexico 构建,但可以使用 cl?
Why does my code fail to buld with Mex but work with cl?
嘿,我正在努力将一个硬件连接到一个由 MATLAB 控制的设置中。我已经编写了一组函数(尝试了 C 和 C++),它们利用这个硬件来执行简单的任务。
代码使用 cl 编译得很好。但是,当我尝试使用 mex 进行编译时,它似乎无法从我的包含中得到 link 符号(我使用 -I 标志指向我的 header 文件的目录)。
有什么想法吗?
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 在我的一个header中。使用 MEX 的 -v 选项虽然它显示这些文件夹被包含在内。如有任何帮助,我们将不胜感激!
编辑:添加使用的 cl 和 mex 命令。 isConnected.c 和 isConnectedMex.c 之间的唯一区别是 isConnectedMex.c 使用 mexFunction 调用作为它的主要方法。
-L
选项是指定linker可以找到所需库文件的目录。您需要使用 -l
选项(小写 L)来指定要 link 的库。这是它的样子:
mex isConnectedMex.c -Iinclude\ArenaC -Llib64\ArenaC -lArenaC_v140
或者,如果 lib 文件是静态库,您可以将其作为输入文件传递:
mex isConnectedMex.c lib64\ArenaC\ArenaC_v140.lib -Iinclude\ArenaC
嘿,我正在努力将一个硬件连接到一个由 MATLAB 控制的设置中。我已经编写了一组函数(尝试了 C 和 C++),它们利用这个硬件来执行简单的任务。
代码使用 cl 编译得很好。但是,当我尝试使用 mex 进行编译时,它似乎无法从我的包含中得到 link 符号(我使用 -I 标志指向我的 header 文件的目录)。
有什么想法吗?
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 在我的一个header中。使用 MEX 的 -v 选项虽然它显示这些文件夹被包含在内。如有任何帮助,我们将不胜感激!
编辑:添加使用的 cl 和 mex 命令。 isConnected.c 和 isConnectedMex.c 之间的唯一区别是 isConnectedMex.c 使用 mexFunction 调用作为它的主要方法。
-L
选项是指定linker可以找到所需库文件的目录。您需要使用 -l
选项(小写 L)来指定要 link 的库。这是它的样子:
mex isConnectedMex.c -Iinclude\ArenaC -Llib64\ArenaC -lArenaC_v140
或者,如果 lib 文件是静态库,您可以将其作为输入文件传递:
mex isConnectedMex.c lib64\ArenaC\ArenaC_v140.lib -Iinclude\ArenaC