连接C墨西哥人c++代码的功能
今天,我很高兴欢迎客人的博客
Navid Rahbariasr
。Navid最近收到一个请求从用户试图包括c++代码中引用的模型在加速器模式。不幸的是,这种用户被迫使用MATLAB R2020b和无法利用的
c++支万博1manbetx持模型参考仿真目标
在MATLAB R2021a补充道。这是解决Navid想出了。
——人
配置功能构建器包括c++代码
让我们从一个简单的例子开始,功能是调用一个方法
get_a
中定义的自定义c++源代码。头和自定义c++代码的源代码如下:
注意“::”是一个c++算子。它被称为
范围解析操作符
时,可以用来访问一个全局变量有一个同名的局部变量。所以,在这个例子中,我们有一个全局变量命名
一个
,一个局部变量内具有相同名称的方法。通过添加::前面的
一个
我们表示对全局变量的兴趣
一个
的值,在本例中2。这个操作符::没有定义在C语言中,如果你尝试编译这段代码在C语言中,你会得到一个语法错误。
我们包括自定义标题包括部分的s函数生成器如下所示:
我们所说的方法
get_a
包装器函数s函数的输出,并将其分配给功能块的输出:
我们添加的c++源代码库条目中定义的函数可以调用该方法。你可以找到图书馆条目底部的s函数构建器接口:
最后,我们构建s函数:
注意,我们已经建立的语言c++的功能。如果我们将它设置为C,我们将得到一个错误的方法
get_a
未解决的:
通过设置语言c++,构建功能。现在如果我们运行模型,并检查输出,我们看到的输出是2,全局变量的值
一个
:
引用模型
如果我们参考上述模型在正常模式下,我们将会得到2的期望值。
然而,如果我们设置模型块到加速器模式和尝试运行模型,我们可以看到一个错误关于一个未解决的外部符号时看起来很类似于上面所示的s函数构建器将C而不是c++语言:
表明仿真软件无法找到的错误万博1manbetx
sfcn_test_wrapper.c
和
custom_code。c——
这是准确的,因为这些文件cpp扩展而不是c !这正在发生,因为仿真软件引擎首先生成一个模拟目标的参考模型在万博1manbetx加速器模式语言是C,因此它是解释的符号C而不是c++,因此加速器模式构建不能正确链接功能。
解决方案
如果我们想要引用的加速模型建立成功,我们需要编写S-Functions在C语言中,但是我们的源代码使用c++的特性,所以如何写C的功能吗?
诀窍是将功能链接到源代码的编译版本,所以编译器不需要重新编译(就像磨c++ C编译器的食物,没有正确的牙齿咀嚼它!)但是,C代码调用c++编译方法吗?答案是肯定的,只要我们用c++声明方法
走读生C {}
,所以编译器使用C编译方法时命名约定。
我们第一次修改自定义头文件由包装外面的C的方法如下:
请注意,
# ifdef __cplusplus
是一个编译器指令。这实际上意味着“如果语言c++…”。当我们编译源代码,编译器检测到它是c++包装方法声明
外来的“C”{}
所以编译对象将C命名方案。
现在我们编译源代码的对象文件通过墨西哥人- c标志:
墨西哥人- c custom_source.cpp
通过运行这个命令,你将得到一个对象文件
custom_code.obj
文件夹中包含的编译版本
custom_source.cpp
:
现在我们去s函数生成器和修改两件事:
1)改变语言C
2)链接的s函数编译obj文件而不是没有编译的源文件(惊喜!你可以链接obj文件的功能!)
因为我们链接的s函数编译c++代码而不是没有编译的c++代码,功能可以使用C语言构建的。
现在,如果我们去模型和运行模型在加速模式下,它将建立仿真目标成功,我们将得到的预期输出2:
基本上,我们可以链接的加速器建造只理解C语言C墨西哥人s函数,编译c++ obj文件:
c++支万博1manbetx持R2021a模型参考仿真目标
对于旧版本上面的解决方法是有用的。在R2021a,如果您的模型包括c++ S-Functions,您可以简单地设置
语言
c++的模拟配置设置的目标部分,这将使加速器构建c++语言理解和解释c++功能正确。
和一切都使用c++构建:
现在轮到你了
|
- カテゴリ:
- 代码生成,
- 客座博客,
- 基于模型的设计,
- S-functions,
- 有什么新鲜事吗?
コメント
コメントを残すには,ここをクリックしてMathWorksアカウントにサインインするか新しいMathWorksアカウントを作成します。