How to generate a shared library (SO/DLL) using CMake-based toolchain in Simulink

20 vues (au cours des 30 derniers jours)
Anil Ozturk
Anil Ozturk le 13 Août 2025
Réponse apportée : Chris Cripps le 28 Oct 2025 à 16:50
Hello everyone,
I have defined a CMake-based toolchain in MATLAB 2024b as follows:
% matlab script
tc = target.create('Toolchain', 'Name', 'MySimpleToolchain');
tc.Builder = target.create('CMakeBuilder');
tc.Builder.Generator = 'Ninja';
tc.Builder.ToolchainFile = fullfile(pwd, '\LinuxRT_Toolchain\LinuxRT.cmake');
tc.Builder.SupportedBuildTypes(end+1) = ...
target.create('CMakeBuildType', ...
'Name', 'FastMath', ...
'GeneratesDebugSymbols', false, ...
'DebugBuildType', 'FastMathWithDebug');
tc.Builder.SupportedBuildTypes(end+1) = ...
target.create('CMakeBuildType', ...
'Name', 'FastMathWithDebug', ...
'GeneratesDebugSymbols', true);
tc.EnvironmentConfiguration(1).HostOperatingSystemSupport.Linux = true;
tc.EnvironmentConfiguration(1).HostOperatingSystemSupport.Windows = false;
tc.EnvironmentConfiguration(1).HostOperatingSystemSupport.Mac = false;
tc.EnvironmentConfiguration(1).SystemPaths = ...
{'$(MW_MINGW64_LOC)/bin', 'C:/Ninja'};
tc.EnvironmentConfiguration(2) = target.create('EnvironmentConfiguration');
tc.EnvironmentConfiguration(2).HostOperatingSystemSupport.Linux = false;
tc.EnvironmentConfiguration(2).HostOperatingSystemSupport.Windows = true;
tc.EnvironmentConfiguration(2).HostOperatingSystemSupport.Mac = false;
tc.EnvironmentConfiguration(2).SystemPaths = ...
{'C:/Ninja'};
windowsProc = target.get('Processor', 'Intel-x86-64 (Windows64)');
tc.SupportedHardware(end+1) = ...
target.create('HardwareComponentSupport', 'Component', windowsProc);
linuxProc = target.get('Processor', 'Intel-x86-64 (Linux 64)');
tc.SupportedHardware(end+1) = ...
target.create('HardwareComponentSupport', 'Component', linuxProc);
macProc = target.get('Processor', 'Intel-x86-64 (Mac OS X)');
tc.SupportedHardware(end+1) = ...
target.create('HardwareComponentSupport', 'Component', macProc);
target.add(tc);
I use this toolchain with grt.tlc to generate an executable from a Simulink model — this works smoothly.
Now, I would like to generate a shared library (.so or .dll, depending on the platform) from the model instead of an executable. But the defined CMakelists.txt file has the following statements:
...
# Definition of target "samplemodel"
add_executable(samplemodel ${MATLAB_ROOT}/rtw/c/src/common/rt_main.c)
...
My questions are:
  1. Should I simply add certain build options to the existing toolchain to change add_executable(...) statement with add_library(....)?
  2. Or is it necessary to create a custom TLC file instead of using grt.tlc?
Thanks in advance for your help.

Réponses (2)

Aabha
Aabha le 18 Août 2025
I understand that you wish to generate a shared library from your model code instead of an executable. In this case, adding certain specific build options to the existing toolchain may not be useful, since MATLAB does not change the structure of the generated CMakeLists file based on the additional build options alone. The documentation on configuring the ‘CMake’ build process clarifies what build types and customization options are available when using ‘CMake’, as follows:
The code generation process produces 'CMakeLists.txt', which drives the build. However, changing the output type (executable vs. library) is controlled in Simulink via the system target file and build settings, not via 'CMake' flags alone.
As an alternative, you can modify the generated CMakeLists file to include the add_library option, by using a flag ‘BUILD_SHARED_LIB’ as follows:
if(BUILD_SHARED_LIB)
add_library(modelname SHARED ${MODEL_SOURCES})
else()
add_executable(modelname ${MODEL_SOURCES} ${RT_MAIN})
end
Then, you can pass the flag using the additional build options as follows:
tc.Builder.AdditionalBuildOptions = {'-DBUILD_SHARED_LIB=ON'};
After this, when you build, MATLAB will generate the normal CMakeLists.txt, but also include the additional flag in the cmake command line.
Alternatively, you can build a shared library by configuring the code generator to use the system target file ert_shrlib.tlc. This method does not require any modifications in the existing toolchain and will generate a shared library version of your model code. Also, it does not change the code that the code generator produces for your model. Please refer to the following documentation link for more information regarding the same:
I hope this helps.
  1 commentaire
Anil Ozturk
Anil Ozturk le 26 Août 2025
Hi Aabha,
Thanks for your reply. You mentioned that I can modify the generated ‘CMakeLists’ file to include the ‘add_library’ option, by using a flag ‘BUILD_SHARED_LIB’. Could you please elaborate how I can do it? Where should I place the if statement you suggested? Since Simulink generates CMakeLists.txt and puts add_executable line during the auto code generation process, I don't know exactly where to place the suggested lines.
On the other hand, I agree that ert_shrlib.tlc is a better solution for my case. Hoewever, I don't have Embedded Coder license and that's why, I'm trying to find a solution based on grt.tlc.
Regards
Anil

Connectez-vous pour commenter.


Chris Cripps
Chris Cripps le 28 Oct 2025 à 16:50
You can use the slbuild command line API to specify a BuildOutputType for the proceeding build process. For example
slbuild("samplemodel", "BuildOutputType", "SharedLibrary")
will build a shared library for the model 'samplemodel'.
Valid values for BuildOutputType are Auto, Executable, StaticLibrary and SharedLibrary.
Please see the slbuild reference page for more information.

Catégories

En savoir plus sur Generated Code Compilation dans Help Center et File Exchange

Produits


Version

R2024b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by