blob: 96778b7537ee153eafa8cbc31bff5429d4fc8c8a [file] [log] [blame]
<!--
Documentation/_templates/layout.html
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership. The
ASF licenses this file to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance with the
License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
License for the specific language governing permissions and limitations
under the License.
-->
<!DOCTYPE html>
<html class="writer-html5" lang="en">
<head>
<meta charset="utf-8" /><meta name="generator" content="Docutils 0.18.1: http://docutils.sourceforge.net/" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>C++ Example using CMake &mdash; NuttX latest documentation</title>
<link rel="stylesheet" type="text/css" href="../_static/pygments.css" />
<link rel="stylesheet" type="text/css" href="../_static/css/theme.css" />
<link rel="stylesheet" type="text/css" href="../_static/copybutton.css" />
<link rel="stylesheet" type="text/css" href="../_static/custom.css" />
<link rel="shortcut icon" href="../_static/favicon.ico"/>
<script src="../_static/jquery.js"></script>
<script src="../_static/_sphinx_javascript_frameworks_compat.js"></script>
<script data-url_root="../" id="documentation_options" src="../_static/documentation_options.js"></script>
<script src="../_static/doctools.js"></script>
<script src="../_static/sphinx_highlight.js"></script>
<script src="../_static/clipboard.min.js"></script>
<script src="../_static/copybutton.js"></script>
<script src="../_static/js/theme.js"></script>
<link rel="index" title="Index" href="../genindex.html" />
<link rel="search" title="Search" href="../search.html" />
<link rel="next" title="pysimCoder integration with NuttX" href="pysimcoder.html" />
<link rel="prev" title="Task Trace Internals" href="tasktraceinternal.html" />
</head>
<body class="wy-body-for-nav">
<div class="wy-grid-for-nav">
<nav data-toggle="wy-nav-shift" class="wy-nav-side">
<div class="wy-side-scroll">
<div class="wy-side-nav-search" >
<a href="../index.html" class="icon icon-home"> NuttX
</a>
<!-- this version selector is quite ugly, should be probably replaced by something
more modern -->
<div class="version-selector">
<select onchange="javascript:location.href = this.value;">
<option value="../../latest" selected="selected">latest</option>
<option value="../../10.0.0" >10.0.0</option>
<option value="../../10.0.1" >10.0.1</option>
<option value="../../10.1.0" >10.1.0</option>
<option value="../../10.2.0" >10.2.0</option>
<option value="../../10.3.0" >10.3.0</option>
<option value="../../11.0.0" >11.0.0</option>
<option value="../../12.0.0" >12.0.0</option>
<option value="../../12.1.0" >12.1.0</option>
<option value="../../12.2.0" >12.2.0</option>
<option value="../../12.2.1" >12.2.1</option>
<option value="../../12.3.0" >12.3.0</option>
<option value="../../12.4.0" >12.4.0</option>
<option value="../../12.5.0" >12.5.0</option>
<option value="../../12.5.1" >12.5.1</option>
<option value="../../12.6.0" >12.6.0</option>
<option value="../../12.7.0" >12.7.0</option>
<option value="../../12.8.0" >12.8.0</option>
<option value="../../12.9.0" >12.9.0</option>
<option value="../../12.10.0" >12.10.0</option>
<option value="../../12.11.0" >12.11.0</option>
</select>
</div>
<div role="search">
<form id="rtd-search-form" class="wy-form" action="../search.html" method="get">
<input type="text" name="q" placeholder="Search docs" aria-label="Search docs" />
<input type="hidden" name="check_keywords" value="yes" />
<input type="hidden" name="area" value="default" />
</form>
</div>
</div><div class="wy-menu wy-menu-vertical" data-spy="affix" role="navigation" aria-label="Navigation menu">
<p class="caption" role="heading"><span class="caption-text">Table of Contents</span></p>
<ul class="current">
<li class="toctree-l1"><a class="reference internal" href="../index.html">Home</a></li>
<li class="toctree-l1"><a class="reference internal" href="../introduction/index.html">Introduction</a></li>
<li class="toctree-l1"><a class="reference internal" href="../quickstart/index.html">Getting Started</a></li>
<li class="toctree-l1"><a class="reference internal" href="../contributing/index.html">Contributing</a></li>
<li class="toctree-l1"><a class="reference internal" href="../introduction/inviolables.html">The Inviolable Principles of NuttX</a></li>
<li class="toctree-l1"><a class="reference internal" href="../platforms/index.html">Supported Platforms</a></li>
<li class="toctree-l1"><a class="reference internal" href="../components/index.html">OS Components</a></li>
<li class="toctree-l1"><a class="reference internal" href="../applications/index.html">Applications</a></li>
<li class="toctree-l1"><a class="reference internal" href="../implementation/index.html">Implementation Details</a></li>
<li class="toctree-l1"><a class="reference internal" href="../reference/index.html">API Reference</a></li>
<li class="toctree-l1"><a class="reference internal" href="../faq/index.html">FAQ</a></li>
<li class="toctree-l1 current"><a class="reference internal" href="index.html">Guides</a><ul class="current">
<li class="toctree-l2"><a class="reference internal" href="nfs.html">NFS Client How-To</a></li>
<li class="toctree-l2"><a class="reference internal" href="usbtrace.html">USB Device Trace</a></li>
<li class="toctree-l2"><a class="reference internal" href="simulator.html">Simulator</a></li>
<li class="toctree-l2"><a class="reference internal" href="qemugdb.html">How to debug NuttX using QEMU and GDB</a></li>
<li class="toctree-l2"><a class="reference internal" href="rndis.html">How to use RNDIS</a></li>
<li class="toctree-l2"><a class="reference internal" href="drivers.html">Drivers</a></li>
<li class="toctree-l2"><a class="reference internal" href="tasktrace.html">Task Trace</a></li>
<li class="toctree-l2 current"><a class="current reference internal" href="#">C++ Example using CMake</a><ul>
<li class="toctree-l3"><a class="reference internal" href="#preparation">Preparation</a></li>
<li class="toctree-l3"><a class="reference internal" href="#creating-the-project">Creating the project</a></li>
<li class="toctree-l3"><a class="reference internal" href="#building">Building</a></li>
</ul>
</li>
<li class="toctree-l2"><a class="reference internal" href="pysimcoder.html">pysimCoder integration with NuttX</a></li>
<li class="toctree-l2"><a class="reference internal" href="customboards.html">Custom Boards How-To</a></li>
<li class="toctree-l2"><a class="reference internal" href="customapps.html">Custom Apps How-to</a></li>
<li class="toctree-l2"><a class="reference internal" href="citests.html">Running CI Test Locally</a></li>
<li class="toctree-l2"><a class="reference internal" href="zerolatencyinterrupts.html">High Performance: Zero Latency Interrupts, Maskable nested interrupts</a></li>
<li class="toctree-l2"><a class="reference internal" href="kasan.html">The Kernel Address Sanitizer (KASAN)</a></li>
<li class="toctree-l2"><a class="reference internal" href="nestedinterrupts.html">Nested Interrupts</a></li>
<li class="toctree-l2"><a class="reference internal" href="cortexmhardfaults.html">Analyzing Cortex-M Hardfaults</a></li>
<li class="toctree-l2"><a class="reference internal" href="coredump.html">Core Dump</a></li>
<li class="toctree-l2"><a class="reference internal" href="coresight.html">Coresight - HW Assisted Tracing on ARM</a></li>
<li class="toctree-l2"><a class="reference internal" href="gdbserver.html">gdbserver</a></li>
<li class="toctree-l2"><a class="reference internal" href="gdbwithpython.html">GDB with Python</a></li>
<li class="toctree-l2"><a class="reference internal" href="ofloader.html">Open Flash Loader</a></li>
<li class="toctree-l2"><a class="reference internal" href="testingtcpip.html">Testing TCP/IP Network Stacks</a></li>
<li class="toctree-l2"><a class="reference internal" href="automounter.html">Auto-Mounter</a></li>
<li class="toctree-l2"><a class="reference internal" href="stm32nullpointer.html">STM32 Null Pointer Detection</a></li>
<li class="toctree-l2"><a class="reference internal" href="stm32ccm.html">STM32 CCM Allocator</a></li>
<li class="toctree-l2"><a class="reference internal" href="stackrecord.html">Run time stack statistics</a></li>
<li class="toctree-l2"><a class="reference internal" href="etcromfs.html">etc romfs</a></li>
<li class="toctree-l2"><a class="reference internal" href="thread_local_storage.html">Thread Local Storage</a></li>
</ul>
</li>
<li class="toctree-l1"><a class="reference internal" href="../glossary.html">Glossary</a></li>
<li class="toctree-l1"><a class="reference internal" href="../logos/index.html">NuttX Logos</a></li>
</ul>
</div>
</div>
</nav>
<section data-toggle="wy-nav-shift" class="wy-nav-content-wrap"><nav class="wy-nav-top" aria-label="Mobile navigation menu" >
<i data-toggle="wy-nav-top" class="fa fa-bars"></i>
<a href="../index.html">NuttX</a>
</nav>
<div class="wy-nav-content">
<div class="rst-content">
<div role="navigation" aria-label="Page navigation">
<ul class="wy-breadcrumbs">
<li><a href="../index.html" class="icon icon-home" aria-label="Home"></a></li>
<li class="breadcrumb-item"><a href="index.html">Guides</a></li>
<li class="breadcrumb-item active">C++ Example using CMake</li>
<li class="wy-breadcrumbs-aside">
<a href="../_sources/guides/cpp_cmake.rst.txt" rel="nofollow"> View page source</a>
</li>
</ul>
<hr/>
</div>
<div role="main" class="document" itemscope="itemscope" itemtype="http://schema.org/Article">
<div itemprop="articleBody">
<section id="c-example-using-cmake">
<span id="cpp-cmake"></span><h1>C++ Example using CMake<a class="headerlink" href="#c-example-using-cmake" title="Permalink to this heading"></a></h1>
<p>In some situations, developers intend to implement software using the NuttX platform in
a previously set hardware and configuration where it is not possible or allowed to make
changes. In such situations, less contact with the operating source tree is better, where
it is only used for the application.</p>
<p>Some approaches are possible to do that today:</p>
<ul class="simple">
<li><p><a class="reference external" href="https://cwiki.apache.org/confluence/display/NUTTX/Building+NuttX+with+Applications+Outside+of+the+Source+Tree">https://cwiki.apache.org/confluence/display/NUTTX/Building+NuttX+with+Applications+Outside+of+the+Source+Tree</a></p></li>
<li><p><a class="reference external" href="https://www.programmersought.com/article/61604062421/">https://www.programmersought.com/article/61604062421/</a></p></li>
</ul>
<p>We have been seen the increase of the use of C++ language in embedded systems application. And
CMake (<a class="reference external" href="https://www.cmake.org">https://www.cmake.org</a>) is the preferred build system used to build C++ projects. NuttX
support C++ based projects.</p>
<p>Using the ‘build as a library’ procedure of NuttX, it is possible to build NuttX
applications using C++ language and also the cmake build tool.</p>
<p>This document will show how to reimplement the hellocpp project using this cmake.</p>
<section id="preparation">
<h2>Preparation<a class="headerlink" href="#preparation" title="Permalink to this heading"></a></h2>
<ol class="arabic">
<li><p>Base NuttX compilation changes</p>
<blockquote>
<div><p>For this example, load the configuration ‘stm32f4discovery:testlibcxx’ for building</p>
<div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="gp">$ </span><span class="nb">cd</span><span class="w"> </span>nuttx
<span class="gp">$ </span>./tools/configure.sh<span class="w"> </span>stm32f4discovery:testlibcxx
</pre></div>
</div>
<p>In menuconfig, the main points to be changed on a typical NuttX configuration are the following:</p>
<ul class="simple">
<li><p>Set RTOS Features -&gt; Tasks and Scheduling -&gt; Application entry point to ‘hellocpp_main’</p></li>
<li><p>Build NuttX and generate the export</p></li>
</ul>
<div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="gp">$ </span>make<span class="w"> </span><span class="nb">export</span>
</pre></div>
</div>
</div></blockquote>
</li>
</ol>
</section>
<section id="creating-the-project">
<h2>Creating the project<a class="headerlink" href="#creating-the-project" title="Permalink to this heading"></a></h2>
<ol class="arabic">
<li><p>Create your project file structure</p>
<blockquote>
<div><p>The project structure is organized as follow:</p>
<div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="go">hellocpp/</span>
<span class="go">hellocpp/CMakeLists.txt</span>
<span class="go">hellocpp/cmake/stm32f4discovery.cmake</span>
<span class="go">hellocpp/nuttx-export-10.0.1/</span>
<span class="go">hellocpp/src/CMakeLists.txt</span>
<span class="go">hellocpp/src/main.cpp</span>
<span class="go">hellocpp/src/HelloWorld.h</span>
<span class="go">hellocpp/src/HelloWorld.cpp</span>
</pre></div>
</div>
<p>The directory ‘nuttx-export-10.0.1’ is the unzipped content from the file created during
make export procedure done before.</p>
</div></blockquote>
</li>
<li><p>File contents</p></li>
</ol>
<ul class="simple">
<li><p>hellocpp/CMakeLists.txt</p></li>
</ul>
<div class="highlight-cmake notranslate"><div class="highlight"><pre><span></span><span class="nb">cmake_minimum_required</span><span class="p">(</span><span class="s">VERSION</span><span class="w"> </span><span class="s">3.2...3.15</span><span class="p">)</span>
<span class="nb">project</span><span class="p">(</span><span class="s">HelloCpp</span>
<span class="w"> </span><span class="s">VERSION</span><span class="w"> </span><span class="s">1.0</span>
<span class="w"> </span><span class="s">DESCRIPTION</span><span class="w"> </span><span class="s2">&quot;Hello world C++ NuttX&quot;</span>
<span class="p">)</span>
<span class="nb">set</span><span class="p">(</span><span class="s">CMAKE_CXX_STANDARD</span><span class="w"> </span><span class="s">17</span><span class="p">)</span>
<span class="nb">set</span><span class="p">(</span><span class="s">CMAKE_CXX_STANDARD_REQUIRED</span><span class="w"> </span><span class="s">ON</span><span class="p">)</span>
<span class="c"># set(CMAKE_CXX_EXTENSIONS OFF)</span>
<span class="nb">set</span><span class="p">(</span><span class="s">CMAKE_C_STANDARD</span><span class="w"> </span><span class="s">99</span><span class="p">)</span>
<span class="nb">set</span><span class="p">(</span><span class="s">NUTTX_PATH</span><span class="w"> </span><span class="s2">&quot;${CMAKE_SOURCE_DIR}/nuttx-export-10.0.1&quot;</span><span class="p">)</span>
<span class="nb">include</span><span class="p">(</span><span class="s">cmake/stm32f4discovery.cmake</span><span class="p">)</span>
<span class="nb">set</span><span class="p">(</span><span class="s">AC_COMMON_FLAGS</span><span class="w"> </span><span class="s2">&quot;${AC_COMMON_FLAGS} -Wall -Wshadow -Wundef -fno-strict-aliasing -Os&quot;</span><span class="p">)</span>
<span class="nb">set</span><span class="p">(</span><span class="s">AC_COMMON_FLAGS</span><span class="w"> </span><span class="s2">&quot;${AC_COMMON_FLAGS} -D_DEBUG -D_LIBCPP_BUILD_STATIC -D_LIBCPP_NO_EXCEPTIONS &quot;</span><span class="p">)</span>
<span class="nb">set</span><span class="p">(</span><span class="s">AC_COMMON_FLAGS</span><span class="w"> </span><span class="s2">&quot;${AC_COMMON_FLAGS} -fno-exceptions -fcheck-new -fno-rtti -pedantic &quot;</span><span class="p">)</span>
<span class="nb">set</span><span class="p">(</span><span class="s">AC_COMMON_FLAGS</span><span class="w"> </span><span class="s2">&quot;${AC_COMMON_FLAGS} -nostdinc++&quot;</span><span class="p">)</span>
<span class="nb">set</span><span class="p">(</span><span class="s">AC_DEFINES</span><span class="w"> </span><span class="s2">&quot;${AC_DEFINES} -DCONFIG_WCHAR_BUILTIN&quot;</span><span class="p">)</span>
<span class="nb">include_directories</span><span class="p">(</span>
<span class="w"> </span><span class="s">src</span>
<span class="w"> </span><span class="o">${</span><span class="nv">NUTTX_PATH</span><span class="o">}</span><span class="s">/include</span>
<span class="w"> </span><span class="o">${</span><span class="nv">NUTTX_PATH</span><span class="o">}</span><span class="s">/include/libcxx</span>
<span class="w"> </span><span class="o">${</span><span class="nv">NUTTX_PATH</span><span class="o">}</span><span class="s">/arch/chip</span>
<span class="p">)</span>
<span class="nb">set</span><span class="p">(</span><span class="s">EXE_NAME</span><span class="w"> </span><span class="s">hellocpp</span><span class="p">)</span>
<span class="nb">set</span><span class="p">(</span><span class="s">CMAKE_C_FLAGS</span><span class="w"> </span><span class="s2">&quot;${CMAKE_C_FLAGS} ${AC_HW_FLAGS} ${AC_DEFINES}&quot;</span><span class="p">)</span>
<span class="nb">set</span><span class="p">(</span><span class="s">CMAKE_CXX_FLAGS</span><span class="w"> </span><span class="s2">&quot;${AC_HW_FLAGS} ${AC_DEFINES} ${AC_COMMON_FLAGS} ${AC_CXX_EXTRA_FLAGS}&quot;</span><span class="p">)</span>
<span class="nb">if</span><span class="w"> </span><span class="p">(</span><span class="s">PARAM_DEBUG</span><span class="p">)</span>
<span class="w"> </span><span class="nb">set</span><span class="p">(</span><span class="s">CMAKE_CXX_FLAGS</span><span class="w"> </span><span class="s2">&quot;${CMAKE_CXX_FLAGS} -g&quot;</span><span class="p">)</span>
<span class="nb">endif</span><span class="p">()</span>
<span class="nb">set</span><span class="p">(</span><span class="s">CMAKE_SKIP_RPATH</span><span class="w"> </span><span class="s">ON</span><span class="p">)</span>
<span class="nb">set</span><span class="p">(</span><span class="s">CMAKE_CXX_LINK_EXECUTABLE</span><span class="w"> </span><span class="s2">&quot;${CMAKE_LINKER} ${AC_LINKER_FLAGS} -o ${EXE_NAME}.elf &lt;OBJECTS&gt; &lt;LINK_LIBRARIES&gt;&quot;</span><span class="p">)</span>
<span class="nb">set</span><span class="p">(</span><span class="s">BUILD_SHARED_LIBS</span><span class="w"> </span><span class="s">OFF</span><span class="p">)</span>
<span class="nb">add_subdirectory</span><span class="p">(</span><span class="s">src</span><span class="p">)</span>
</pre></div>
</div>
<ul class="simple">
<li><p>hellocpp/cmake/stm32f4discovery.cmake</p></li>
</ul>
<div class="highlight-cmake notranslate"><div class="highlight"><pre><span></span><span class="nb">set</span><span class="p">(</span><span class="s">CMAKE_SYSTEM_NAME</span><span class="w"> </span><span class="s">Generic</span><span class="p">)</span>
<span class="nb">set</span><span class="p">(</span><span class="s">CMAKE_SYSTEM_PROCESSOR</span><span class="w"> </span><span class="s">arm</span><span class="p">)</span>
<span class="nb">set</span><span class="p">(</span><span class="s">MCU_LINKER_SCRIPT</span><span class="w"> </span><span class="s2">&quot;${NUTTX_PATH}/scripts/ld.script&quot;</span><span class="p">)</span>
<span class="nb">set</span><span class="p">(</span><span class="s">COMPILER_PREFIX</span><span class="w"> </span><span class="s">arm-none-eabi-</span><span class="p">)</span>
<span class="c"># cmake-format: off</span>
<span class="nb">set</span><span class="p">(</span><span class="s">CMAKE_C_COMPILER</span><span class="w"> </span><span class="o">${</span><span class="nv">COMPILER_PREFIX</span><span class="o">}</span><span class="s">gcc</span><span class="p">)</span>
<span class="nb">set</span><span class="p">(</span><span class="s">CMAKE_CXX_COMPILER</span><span class="w"> </span><span class="o">${</span><span class="nv">COMPILER_PREFIX</span><span class="o">}</span><span class="s">g++</span><span class="p">)</span>
<span class="nb">set</span><span class="p">(</span><span class="s">CMAKE_AR</span><span class="w"> </span><span class="o">${</span><span class="nv">COMPILER_PREFIX</span><span class="o">}</span><span class="s">ar</span><span class="p">)</span>
<span class="nb">set</span><span class="p">(</span><span class="s">CMAKE_RANLIB</span><span class="w"> </span><span class="o">${</span><span class="nv">COMPILER_PREFIX</span><span class="o">}</span><span class="s">ranlib</span><span class="p">)</span>
<span class="nb">set</span><span class="p">(</span><span class="s">CMAKE_LINKER</span><span class="w"> </span><span class="o">${</span><span class="nv">COMPILER_PREFIX</span><span class="o">}</span><span class="s">ld</span><span class="p">)</span>
<span class="nb">set</span><span class="p">(</span><span class="s">CMAKE_ASM_COMPILER</span><span class="w"> </span><span class="o">${</span><span class="nv">COMPILER_PREFIX</span><span class="o">}</span><span class="s">gcc</span><span class="p">)</span>
<span class="nb">set</span><span class="p">(</span><span class="s">CMAKE_OBJCOPY</span><span class="w"> </span><span class="o">${</span><span class="nv">COMPILER_PREFIX</span><span class="o">}</span><span class="s">objcopy</span><span class="p">)</span>
<span class="nb">set</span><span class="p">(</span><span class="s">CMAKE_OBJDUMP</span><span class="w"> </span><span class="o">${</span><span class="nv">COMPILER_PREFIX</span><span class="o">}</span><span class="s">objdump</span><span class="p">)</span>
<span class="nb">set</span><span class="p">(</span><span class="s">CMAKE_SIZE</span><span class="w"> </span><span class="o">${</span><span class="nv">COMPILER_PREFIX</span><span class="o">}</span><span class="s">size</span><span class="p">)</span>
<span class="nb">set</span><span class="p">(</span><span class="s">CMAKE_FIND_ROOT_PATH_MODE_PROGRAM</span><span class="w"> </span><span class="s">NEVER</span><span class="p">)</span>
<span class="nb">set</span><span class="p">(</span><span class="s">CMAKE_FIND_ROOT_PATH_MODE_LIBRARY</span><span class="w"> </span><span class="s">ONLY</span><span class="p">)</span>
<span class="nb">set</span><span class="p">(</span><span class="s">CMAKE_FIND_ROOT_PATH_MODE_INCLUDE</span><span class="w"> </span><span class="s">ONLY</span><span class="p">)</span>
<span class="nb">set</span><span class="p">(</span><span class="s">CMAKE_FIND_ROOT_PATH_MODE_PACKAGE</span><span class="w"> </span><span class="s">ONLY</span><span class="p">)</span>
<span class="nb">set</span><span class="p">(</span><span class="s">CMAKE_TRY_COMPILE_TARGET_TYPE</span><span class="w"> </span><span class="s">STATIC_LIBRARY</span><span class="p">)</span>
<span class="nb">set</span><span class="p">(</span><span class="s">AC_HW_FLAGS</span><span class="w"> </span><span class="s2">&quot;-mcpu=cortex-m4 -mthumb -mfloat-abi=soft &quot;</span><span class="p">)</span>
<span class="nb">set</span><span class="p">(</span><span class="s">AC_HW_FLAGS</span><span class="w"> </span><span class="s2">&quot;${AC_HW_FLAGS} -isystem ${NUTTX_PATH}/include&quot;</span><span class="p">)</span>
<span class="nb">set</span><span class="p">(</span><span class="s">AC_HW_FLAGS</span><span class="w"> </span><span class="s2">&quot;${AC_HW_FLAGS} -pipe&quot;</span><span class="p">)</span>
<span class="nb">set</span><span class="p">(</span><span class="s">AC_LINKER_FLAGS</span><span class="w"> </span><span class="s2">&quot;--entry=__start -nostdlib -T${MCU_LINKER_SCRIPT}&quot;</span><span class="p">)</span>
</pre></div>
</div>
<ul class="simple">
<li><p>hellocpp/src/CMakeLists.txt</p></li>
</ul>
<div class="highlight-cmake notranslate"><div class="highlight"><pre><span></span><span class="nb">set</span><span class="p">(</span><span class="s">HEADER_FILES</span>
<span class="w"> </span><span class="s">HelloWorld.h</span>
<span class="p">)</span>
<span class="nb">set</span><span class="p">(</span><span class="s">SOURCE_FILES</span>
<span class="w"> </span><span class="s">HelloWorld.cpp</span>
<span class="p">)</span>
<span class="nb">link_directories</span><span class="p">(</span><span class="o">${</span><span class="nv">EXE_NAME</span><span class="o">}</span><span class="w"> </span><span class="o">${</span><span class="nv">NUTTX_PATH</span><span class="o">}</span><span class="s">/libs</span><span class="p">)</span>
<span class="nb">add_executable</span><span class="p">(</span><span class="o">${</span><span class="nv">EXE_NAME</span><span class="o">}</span><span class="w"> </span><span class="o">${</span><span class="nv">SOURCE_FILES</span><span class="o">}</span><span class="w"> </span><span class="s">main.cpp</span><span class="w"> </span><span class="o">${</span><span class="nv">HEADER_FILES</span><span class="o">}</span><span class="p">)</span>
<span class="nb">add_custom_command</span><span class="p">(</span>
<span class="w"> </span><span class="s">TARGET</span><span class="w"> </span><span class="o">${</span><span class="nv">EXE_NAME</span><span class="o">}</span>
<span class="w"> </span><span class="s">POST_BUILD</span>
<span class="w"> </span><span class="s">COMMAND</span><span class="w"> </span><span class="o">${</span><span class="nv">CMAKE_OBJCOPY</span><span class="o">}</span><span class="w"> </span><span class="s">ARGS</span><span class="w"> </span><span class="s">-S</span><span class="w"> </span><span class="s">-O</span><span class="w"> </span><span class="s">binary</span><span class="w"> </span><span class="o">${</span><span class="nv">CMAKE_BINARY_DIR</span><span class="o">}</span><span class="s">/</span><span class="o">${</span><span class="nv">EXE_NAME</span><span class="o">}</span><span class="s">.elf</span><span class="w"> </span><span class="o">${</span><span class="nv">CMAKE_BINARY_DIR</span><span class="o">}</span><span class="s">/</span><span class="o">${</span><span class="nv">EXE_NAME</span><span class="o">}</span><span class="s">.bin</span>
<span class="p">)</span>
<span class="nb">target_link_libraries</span><span class="p">(</span><span class="o">${</span><span class="nv">EXE_NAME</span><span class="o">}</span><span class="w"> </span><span class="s">--start-group</span><span class="p">)</span>
<span class="nb">target_link_libraries</span><span class="p">(</span><span class="o">${</span><span class="nv">EXE_NAME</span><span class="o">}</span><span class="w"> </span><span class="s">sched</span><span class="p">)</span>
<span class="nb">target_link_libraries</span><span class="p">(</span><span class="o">${</span><span class="nv">EXE_NAME</span><span class="o">}</span><span class="w"> </span><span class="s">drivers</span><span class="p">)</span>
<span class="nb">target_link_libraries</span><span class="p">(</span><span class="o">${</span><span class="nv">EXE_NAME</span><span class="o">}</span><span class="w"> </span><span class="s">boards</span><span class="p">)</span>
<span class="nb">target_link_libraries</span><span class="p">(</span><span class="o">${</span><span class="nv">EXE_NAME</span><span class="o">}</span><span class="w"> </span><span class="s">c</span><span class="p">)</span>
<span class="nb">target_link_libraries</span><span class="p">(</span><span class="o">${</span><span class="nv">EXE_NAME</span><span class="o">}</span><span class="w"> </span><span class="s">mm</span><span class="p">)</span>
<span class="nb">target_link_libraries</span><span class="p">(</span><span class="o">${</span><span class="nv">EXE_NAME</span><span class="o">}</span><span class="w"> </span><span class="s">arch</span><span class="p">)</span>
<span class="nb">target_link_libraries</span><span class="p">(</span><span class="o">${</span><span class="nv">EXE_NAME</span><span class="o">}</span><span class="w"> </span><span class="s">xx</span><span class="p">)</span>
<span class="nb">target_link_libraries</span><span class="p">(</span><span class="o">${</span><span class="nv">EXE_NAME</span><span class="o">}</span><span class="w"> </span><span class="s">apps</span><span class="p">)</span>
<span class="nb">target_link_libraries</span><span class="p">(</span><span class="o">${</span><span class="nv">EXE_NAME</span><span class="o">}</span><span class="w"> </span><span class="s">fs</span><span class="p">)</span>
<span class="nb">target_link_libraries</span><span class="p">(</span><span class="o">${</span><span class="nv">EXE_NAME</span><span class="o">}</span><span class="w"> </span><span class="s">binfmt</span><span class="p">)</span>
<span class="nb">target_link_libraries</span><span class="p">(</span><span class="o">${</span><span class="nv">EXE_NAME</span><span class="o">}</span><span class="w"> </span><span class="s">board</span><span class="p">)</span>
<span class="nb">target_link_libraries</span><span class="p">(</span><span class="o">${</span><span class="nv">EXE_NAME</span><span class="o">}</span><span class="w"> </span><span class="s">gcc</span><span class="p">)</span>
<span class="nb">target_link_libraries</span><span class="p">(</span><span class="o">${</span><span class="nv">EXE_NAME</span><span class="o">}</span><span class="w"> </span><span class="s">supc++</span><span class="p">)</span>
<span class="nb">target_link_libraries</span><span class="p">(</span><span class="o">${</span><span class="nv">EXE_NAME</span><span class="o">}</span><span class="w"> </span><span class="s">--end-group</span><span class="p">)</span>
</pre></div>
</div>
<ul class="simple">
<li><p>hellocpp/src/main.cpp</p></li>
</ul>
<div class="highlight-c++ notranslate"><div class="highlight"><pre><span></span><span class="cp">#include</span><span class="w"> </span><span class="cpf">&quot;HelloWorld.h&quot;</span>
<span class="cp">#include</span><span class="w"> </span><span class="cpf">&lt;nuttx/config.h&gt;</span>
<span class="k">extern</span><span class="w"> </span><span class="s">&quot;C&quot;</span>
<span class="p">{</span>
<span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="nf">hellocpp_main</span><span class="p">(</span><span class="kt">void</span><span class="p">)</span>
<span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">CHelloWorld</span><span class="w"> </span><span class="o">*</span><span class="n">pHelloWorld</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">new</span><span class="w"> </span><span class="n">CHelloWorld</span><span class="p">();</span>
<span class="w"> </span><span class="n">pHelloWorld</span><span class="o">-&gt;</span><span class="n">HelloWorld</span><span class="p">();</span>
<span class="w"> </span><span class="n">CHelloWorld</span><span class="w"> </span><span class="n">helloWorld</span><span class="p">;</span>
<span class="w"> </span><span class="n">helloWorld</span><span class="p">.</span><span class="n">HelloWorld</span><span class="p">();</span>
<span class="w"> </span><span class="k">delete</span><span class="w"> </span><span class="n">pHelloWorld</span><span class="p">;</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="mi">0</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span>
<span class="p">}</span>
</pre></div>
</div>
<ul class="simple">
<li><p>hellocpp/src/HelloWorld.h</p></li>
</ul>
<div class="highlight-c++ notranslate"><div class="highlight"><pre><span></span><span class="cp">#ifndef HELLOWORLD_H_</span>
<span class="cp">#define HELLOWORLD_H_</span>
<span class="cp">#include</span><span class="w"> </span><span class="cpf">&quot;nuttx/config.h&quot;</span>
<span class="k">class</span><span class="w"> </span><span class="nc">CHelloWorld</span>
<span class="p">{</span>
<span class="w"> </span><span class="k">public</span><span class="o">:</span>
<span class="w"> </span><span class="n">CHelloWorld</span><span class="p">();</span>
<span class="w"> </span><span class="o">~</span><span class="n">CHelloWorld</span><span class="p">();</span>
<span class="w"> </span><span class="kt">bool</span><span class="w"> </span><span class="nf">HelloWorld</span><span class="p">(</span><span class="kt">void</span><span class="p">);</span>
<span class="w"> </span><span class="k">private</span><span class="o">:</span>
<span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">mSecret</span><span class="p">;</span>
<span class="p">};</span>
<span class="cp">#endif</span>
</pre></div>
</div>
<ul class="simple">
<li><p>hellocpp/src/HelloWorld.cpp</p></li>
</ul>
<div class="highlight-c++ notranslate"><div class="highlight"><pre><span></span><span class="cp">#include</span><span class="w"> </span><span class="cpf">&lt;cstdio&gt;</span>
<span class="cp">#include</span><span class="w"> </span><span class="cpf">&lt;string&gt;</span>
<span class="cp">#include</span><span class="w"> </span><span class="cpf">&quot;HelloWorld.h&quot;</span>
<span class="n">CHelloWorld</span><span class="o">::</span><span class="n">CHelloWorld</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">mSecret</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">42</span><span class="p">;</span>
<span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">printf</span><span class="p">(</span><span class="s">&quot;Constructor: mSecret=%d</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span><span class="n">mSecret</span><span class="p">);</span>
<span class="p">}</span>
<span class="n">CHelloWorld</span><span class="o">::~</span><span class="n">CHelloWorld</span><span class="p">()</span><span class="w"> </span><span class="p">{</span>
<span class="p">}</span>
<span class="kt">bool</span><span class="w"> </span><span class="n">CHelloWorld</span><span class="o">::</span><span class="n">HelloWorld</span><span class="p">(</span><span class="kt">void</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">printf</span><span class="p">(</span><span class="s">&quot;HelloWorld: mSecret=%d</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span><span class="n">mSecret</span><span class="p">);</span>
<span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="w"> </span><span class="n">sentence</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s">&quot;Hello&quot;</span><span class="p">;</span>
<span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">printf</span><span class="p">(</span><span class="s">&quot;TEST=%s</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span><span class="n">sentence</span><span class="p">.</span><span class="n">c_str</span><span class="p">());</span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">mSecret</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">42</span><span class="p">)</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">printf</span><span class="p">(</span><span class="s">&quot;CHelloWorld: HelloWorld: Hello, world!</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">);</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="nb">true</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span>
<span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="p">{</span>
<span class="w"> </span><span class="n">std</span><span class="o">::</span><span class="n">printf</span><span class="p">(</span><span class="s">&quot;CHelloWorld: HelloWorld: CONSTRUCTION FAILED!</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">);</span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="nb">false</span><span class="p">;</span>
<span class="w"> </span><span class="p">}</span>
<span class="p">}</span>
</pre></div>
</div>
</section>
<section id="building">
<h2>Building<a class="headerlink" href="#building" title="Permalink to this heading"></a></h2>
<p>To launch build, you use the cmake procedure:</p>
<div class="highlight-console notranslate"><div class="highlight"><pre><span></span><span class="gp">$ </span>mkdir<span class="w"> </span>build
<span class="gp">$ </span><span class="nb">cd</span><span class="w"> </span>build
<span class="gp">$ </span>cmake<span class="w"> </span>..
<span class="gp">$ </span>make
</pre></div>
</div>
<p>And finally a bin file will be created to be loaded on the board.</p>
</section>
</section>
</div>
</div>
<footer><div class="rst-footer-buttons" role="navigation" aria-label="Footer">
<a href="tasktraceinternal.html" class="btn btn-neutral float-left" title="Task Trace Internals" accesskey="p" rel="prev"><span class="fa fa-arrow-circle-left" aria-hidden="true"></span> Previous</a>
<a href="pysimcoder.html" class="btn btn-neutral float-right" title="pysimCoder integration with NuttX" accesskey="n" rel="next">Next <span class="fa fa-arrow-circle-right" aria-hidden="true"></span></a>
</div>
<hr/>
<div role="contentinfo">
<p>&#169; Copyright 2023, The Apache Software Foundation.</p>
</div>
</footer>
</div>
</div>
</section>
</div>
<script>
jQuery(function () {
SphinxRtdTheme.Navigation.enable(true);
});
</script>
</body>
</html>