<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Andy Dong</title>
    <description>The latest articles on Forem by Andy Dong (@andycall).</description>
    <link>https://forem.com/andycall</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1467898%2F83a3750c-c618-4607-b44f-3fd06ea887a0.jpeg</url>
      <title>Forem: Andy Dong</title>
      <link>https://forem.com/andycall</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/andycall"/>
    <language>en</language>
    <item>
      <title>How to Debug Your C/C++ Project in Flutter Apps</title>
      <dc:creator>Andy Dong</dc:creator>
      <pubDate>Tue, 27 Aug 2024 15:57:38 +0000</pubDate>
      <link>https://forem.com/andycall/setting-up-a-development-and-debugging-environment-for-your-cc-project-with-flutter-apps-234e</link>
      <guid>https://forem.com/andycall/setting-up-a-development-and-debugging-environment-for-your-cc-project-with-flutter-apps-234e</guid>
      <description>&lt;p&gt;For Flutter app development, it's easy to set up a development and debugging environment with Dart using VS Code or JetBrains IDE. &lt;/p&gt;

&lt;p&gt;However, when using C/C++ in Flutter, things are different because the official Dart &amp;amp; Flutter IDE plugins are not designed for C/C++ development.&lt;/p&gt;

&lt;p&gt;To develop and debug C/C++ on multiple operating systems, we need to configure and set up different IDEs for each platform as follows:&lt;/p&gt;

&lt;p&gt;There are many development environments for C/C++ projects. We can use Xcode for iOS and macOS, Android Studio for Android, Visual Studio for Windows, and other IDE tools for Linux platforms.&lt;/p&gt;

&lt;p&gt;In my personal experience, the best development IDE I have used most often is JetBrains' CLion, which provides a consistent development experience across platforms.&lt;/p&gt;

&lt;p&gt;For developers using C/C++ in Flutter apps, it's common to deploy and share the same codebase across different platforms with various operating systems and CPU architectures. Using the same IDE makes it more convenient to reuse your experience with these tools.&lt;/p&gt;

&lt;h2&gt;
  
  
  Configuring Your C/C++ Project with CLion
&lt;/h2&gt;

&lt;p&gt;CLion has built-in support for CMake projects. To set up CLion with IntelliSense, you need to open the project folder that contains the &lt;code&gt;CMakeLists.txt&lt;/code&gt; file. In our example project, that will be &lt;code&gt;&amp;lt;project_root&amp;gt;/src&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fepgwxxvedhpa5q6wsjd5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fepgwxxvedhpa5q6wsjd5.png" alt="Setup Clion" width="800" height="472"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;CLion will configure your C/C++ projects based on your CMake configuration automatically.&lt;/p&gt;

&lt;h3&gt;
  
  
  Debugging Your Flutter Apps with CLion
&lt;/h3&gt;

&lt;p&gt;It's easier to debug Flutter apps with CLion on desktop platforms, including macOS, Windows, and Linux.&lt;/p&gt;

&lt;p&gt;It's also recommended to develop your C/C++ code on a desktop first, then cross-compile it and run it on mobile platforms.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Starting a Flutter App with CLion LLDB Debugger&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;First, you need to compile your Flutter app:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;flutter build macos &lt;span class="nt"&gt;--debug&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After your Flutter app is compiled, the app will be generated at &lt;code&gt;&amp;lt;project_root&amp;gt;/example/build/macos/Build/Products/Debug/flutter_native_example_example.app&lt;/code&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;For Linux or Windows platforms, just look for your Flutter app under the &lt;code&gt;&amp;lt;project_root&amp;gt;/example/build/&lt;/code&gt; directory.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Adding a Debugger Configuration in CLion&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Open CLion, click the &lt;code&gt;Edit Configurations&lt;/code&gt; selection menu at the top:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flygk0ebsv5js7pw8nkq5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flygk0ebsv5js7pw8nkq5.png" alt="Edit Configuration" width="800" height="461"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click the &lt;code&gt;+&lt;/code&gt; button on the top left and select &lt;code&gt;Native Application&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frqef2075mfl7agym886i.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frqef2075mfl7agym886i.png" alt="Add Executable" width="800" height="611"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Find and select the executable file for your Flutter app in the &lt;code&gt;&amp;lt;project_root&amp;gt;/example/build/&lt;/code&gt; directory.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgulzpp7oaegc7olb6ax1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgulzpp7oaegc7olb6ax1.png" alt="Target" width="800" height="472"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The selection results will be as follows:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2y4twnw942iq73qmffkw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2y4twnw942iq73qmffkw.png" alt="CLion" width="800" height="567"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now it's ready for debugging. Click the debug icon on the top bar to start your debugging:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzpp120h57ewb8xt0pqa1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzpp120h57ewb8xt0pqa1.png" alt="CLion Debugging" width="800" height="853"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Attaching a Running Application with CLion Debugger&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If your application started earlier than the CLion debugger, you can attach an existing running Flutter app with the &lt;code&gt;Attach To Process&lt;/code&gt; feature in CLion:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnrbbglgwy2im7hpoiiix.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnrbbglgwy2im7hpoiiix.png" alt="Clion Attach To Process" width="800" height="571"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Debugging C/C++ Code in Xcode
&lt;/h2&gt;

&lt;p&gt;Xcode is an alternative IDE for C/C++ debugging on macOS and iOS platforms. First, open the &lt;code&gt;Runner.xcworkspace&lt;/code&gt; project in Xcode.&lt;/p&gt;

&lt;p&gt;The source code of our C/C++ code is not visible in Xcode by default, so we need additional setup to make it visible and allow setting breakpoints on it:&lt;/p&gt;

&lt;p&gt;In Xcode, right-click the &lt;code&gt;Runner&lt;/code&gt; project and select &lt;code&gt;Add Files to "Runner"&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fozq3ic40dn547cmebbos.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fozq3ic40dn547cmebbos.png" alt="Xcode Add File" width="800" height="1151"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Select the source folder that contains &lt;code&gt;CMakeLists.txt&lt;/code&gt;, but keep in mind to unselect all targets at the bottom because we don't want Xcode to package our C/C++ code in our project.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbl9fsj5zvf7j8ovbojfn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbl9fsj5zvf7j8ovbojfn.png" alt="Xcode Select Files" width="800" height="767"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now we can set breakpoints in Xcode and debug the C++ source code:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcbvydopo22pt1oes3qqq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcbvydopo22pt1oes3qqq.png" alt="Xcode debugging" width="800" height="514"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Debugging C/C++ Code in Android Studio
&lt;/h2&gt;

&lt;p&gt;Android Studio for Android has built-in support for developing and debugging C/C++ code.&lt;/p&gt;

&lt;p&gt;For a Flutter app for Android, open the &lt;code&gt;example/android&lt;/code&gt; directory in Android Studio:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4v4l9ihj54ofxwy4xcfi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4v4l9ihj54ofxwy4xcfi.png" alt="Android Path" width="800" height="448"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once your project is fully configured in Android Studio, you will see your C/C++ code recognized and indexed by Android Studio.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn3ofytceis6chj4yi0pm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn3ofytceis6chj4yi0pm.png" alt="Android Studio" width="800" height="516"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click the &lt;code&gt;app&lt;/code&gt; entry point at the top and select "Edit Configuration":&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj2yy48f63ll4cs62o2lf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fj2yy48f63ll4cs62o2lf.png" alt="Edit Android Config" width="576" height="292"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Make sure the debug type is set to "Dual (Java + Native)" mode:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnpzj1e74gb7nddjl0vhk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnpzj1e74gb7nddjl0vhk.png" alt="Android Debug Mode" width="800" height="515"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now our C/C++ code can be developed and debugged in Android Studio:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk169doech1bfxvdacy9p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk169doech1bfxvdacy9p.png" alt="Android Studio Debugging" width="800" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Debugging C/C++ Code in Visual Studio
&lt;/h2&gt;

&lt;p&gt;Visual Studio on the Windows platform provides a robust developer experience for C/C++.&lt;/p&gt;

&lt;p&gt;Flutter projects use CMake to generate Visual Studio project templates.&lt;/p&gt;

&lt;p&gt;First, compile your Flutter app by running the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;flutter build windows &lt;span class="nt"&gt;--debug&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will generate the Visual Studio project workspace in the &lt;code&gt;&amp;lt;project_root&amp;gt;/example/build/windows/x64&lt;/code&gt; directory. Open Visual Studio and load the &lt;code&gt;ALL_BUILD.vcproj&lt;/code&gt; file from this location.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa1n15nlcyredngh2r4as.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa1n15nlcyredngh2r4as.png" alt="VS Location" width="800" height="452"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Right-click on the solution title and select &lt;code&gt;Properties&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjghkni2j1zmr3g5v62bg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjghkni2j1zmr3g5v62bg.png" alt="Config Solution" width="800" height="601"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Change the &lt;code&gt;Single startup project&lt;/code&gt; value to &lt;code&gt;flutter_native_example_example&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmlp503im27mqhdabenc1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmlp503im27mqhdabenc1.png" alt="Change VS Solution" width="800" height="559"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Open the C/C++ code files in the &lt;code&gt;demo_library&lt;/code&gt; folder and set your breakpoints:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcjnfwuv9u6morhzzhr5i.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcjnfwuv9u6morhzzhr5i.png" alt="VS Set Breakpoint" width="800" height="424"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click on &lt;code&gt;Debug&lt;/code&gt; -&amp;gt; &lt;code&gt;Start Debugging&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkaou0m00w8xuoapa521w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkaou0m00w8xuoapa521w.png" alt="VS Starting Debugging" width="800" height="526"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now the debugger should be working:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff99snb0vlml0hgwv2a5v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff99snb0vlml0hgwv2a5v.png" alt="VS Debugging" width="800" height="442"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Next Chapter
&lt;/h2&gt;

&lt;p&gt;In the next chapter, we will focus on Dart FFI in Flutter apps, covering bidirectional synchronous and asynchronous calls, handling complex data structures, and performance optimization tips.&lt;/p&gt;

</description>
      <category>flutter</category>
      <category>cpp</category>
    </item>
    <item>
      <title>The Comprehensive Guide to Using C/C++ in Flutter — Part I</title>
      <dc:creator>Andy Dong</dc:creator>
      <pubDate>Tue, 27 Aug 2024 15:46:35 +0000</pubDate>
      <link>https://forem.com/andycall/the-comprehensive-guide-to-using-cc-in-flutter-part-i-4g9b</link>
      <guid>https://forem.com/andycall/the-comprehensive-guide-to-using-cc-in-flutter-part-i-4g9b</guid>
      <description>&lt;p&gt;Flutter is an open-source UI software development kit created by Google. Its core advantage compared to other cross-platform UI development kits is that it uses its own rendering engine, originally based on Chrome’s Skia. Currently, a new engine called Impeller has been introduced on iOS and Android. With the advantage of a self-owned rendering engine, Flutter controls every pixel on all platform devices, including mobile and desktop platforms, eliminating implementation differences on the UI between these platforms.&lt;/p&gt;

&lt;p&gt;Flutter and Dart excel on the UI side, but for commercial business apps in production, there is a lot of business logic that often depends on other hardware or components provided by the target platform OS. The Dart programming language was intentionally designed for building delightful UIs but is not suitable for accessing hardware I/O and native system components, multithreaded programming, or high-performance computing areas. Therefore, we need to use “low-level” programming languages such as C/C++ or to handle these tasks. Not only do these languages interact directly with hardware without the need for an abstraction layer, but they also work well and efficiently across all platforms.&lt;/p&gt;

&lt;p&gt;This guide is designed for mobile/desktop developers who want to integrate C/C++ codes into their Flutter apps. It includes best practices for configuring build tools, debugging on mobile and desktop, using Dart FFI for bidirectional synchronous and asynchronous calls, handling complex data structures, performance optimization tips, listening for essential Dart VM callbacks on the C/C++ side, and some essential reminders for the Windows platform.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Initialize the Flutter Project&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;The Flutter command includes a built-in scaffold project for using C/C++ with Dart FFI examples.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;flutter create --template=plugin_ffi demo_library --platforms android,ios,macos,windows,linux
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This command creates a Flutter plugin package that contains the basic build scripts for adding C/C++ source code into Flutter packages.&lt;/p&gt;

&lt;p&gt;The C/C++ code is configured and compiled by CMake on Windows, Linux, and Android, and it works well. However, for iOS and macOS, it is configured and compiled using CocoaPods directly.&lt;/p&gt;

&lt;p&gt;Managing two build systems for more complex C/C++ projects is not practical for production use. Therefore, we need to modify the &lt;code&gt;src/CMakeLists.txt&lt;/code&gt; file to generate a static archive library and link the build system from CocoaPods to CMake for the iOS and macOS platforms.&lt;/p&gt;

&lt;h2&gt;
  
  
  Configure Static Linked Build with CMake for macOS
&lt;/h2&gt;

&lt;p&gt;First, we need to update our &lt;code&gt;src/CMakeLists.txt&lt;/code&gt; file and change our build target to a static library for generating a static archive library:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cmake"&gt;&lt;code&gt;&lt;span class="nb"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;CMAKE_SYSTEM_NAME&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; MATCHES &lt;span class="s2"&gt;"Darwin"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="nb"&gt;set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;CMAKE_OSX_ARCHITECTURES &lt;span class="s2"&gt;"x86_64;arm64"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;endif&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="nb"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;CMAKE_SYSTEM_NAME&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; MATCHES &lt;span class="s2"&gt;"Darwin"&lt;/span&gt; OR &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;CMAKE_SYSTEM_NAME&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; MATCHES &lt;span class="s2"&gt;"iOS"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="nb"&gt;add_library&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;demo_library STATIC
    &lt;span class="s2"&gt;"flutter_native_example.c"&lt;/span&gt;
  &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;else&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="nb"&gt;add_library&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;demo_library SHARED
    &lt;span class="s2"&gt;"flutter_native_example.c"&lt;/span&gt;
  &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;endif&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When the build targets the macOS or iOS platform, we set the library type to a static library.&lt;/p&gt;

&lt;p&gt;Then, add the following shell script named &lt;code&gt;build_macos.sh&lt;/code&gt; or &lt;code&gt;build_ios.sh&lt;/code&gt; to build our static library:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Define the function for macOS build&lt;/span&gt;
build_macos&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="nv"&gt;BUILD_TYPE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;1&lt;/span&gt;&lt;span class="k"&gt;:-&lt;/span&gt;&lt;span class="nv"&gt;Debug&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
  &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Building for macOS in &lt;/span&gt;&lt;span class="nv"&gt;$BUILD_TYPE&lt;/span&gt;&lt;span class="s2"&gt; mode"&lt;/span&gt;
  cmake &lt;span class="nt"&gt;-DCMAKE_BUILD_TYPE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$BUILD_TYPE&lt;/span&gt; &lt;span class="nt"&gt;-G&lt;/span&gt; &lt;span class="s2"&gt;"Unix Makefiles"&lt;/span&gt; &lt;span class="nt"&gt;-B&lt;/span&gt; &lt;span class="nv"&gt;$BASEDIR&lt;/span&gt;/cmake-build-macos &lt;span class="nt"&gt;-S&lt;/span&gt; &lt;span class="nv"&gt;$BASEDIR&lt;/span&gt;/
  cmake &lt;span class="nt"&gt;--build&lt;/span&gt; &lt;span class="nv"&gt;$BASEDIR&lt;/span&gt;/cmake-build-macos
&lt;span class="o"&gt;}&lt;/span&gt;

build_macos &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="nv"&gt;$@&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run the following command: &lt;code&gt;./build_macos.sh Release&lt;/code&gt; or &lt;code&gt;./build_macos.sh Debug&lt;/code&gt; for debug purposes.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;➜  src ./build_macos.sh Release
Building for macOS in Release mode
-- Configuring done (0.0s)
-- Generating done (0.0s)
-- Build files have been written to: /Users/andycall/workspace/flutter_native_example/src/cmake-build-macos
[ 50%] Building C object CMakeFiles/demo_library.dir/flutter_native_example.c.o
[100%] Linking C static library libdemo_library.a
[100%] Built target demo_library
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We can see that &lt;code&gt;libdemo_library.a&lt;/code&gt; was generated at &lt;code&gt;&amp;lt;project&amp;gt;/src/cmake-build-macos/libdemo_library.a&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Link CMake with CocoaPods in macOS&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Now, open &lt;code&gt;&amp;lt;project&amp;gt;/macos/flutter_native_example.podspec&lt;/code&gt; and add a "Script Phase" to call the CMake command automatically when the user executes the &lt;code&gt;flutter run&lt;/code&gt; or &lt;code&gt;flutter build&lt;/code&gt; command.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;prepare_command&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'bash build_macos.sh'&lt;/span&gt;
&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;script_phase&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="ss"&gt;:name&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'Trigger Native Build'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="c1"&gt;# First argument is relative path to the `rust` folder, second is name of rust library&lt;/span&gt;
  &lt;span class="ss"&gt;:script&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'ln -fs "$OBJROOT/XCBuildData/build.db" "${BUILT_PRODUCTS_DIR}/build_phony"'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="ss"&gt;:execution_position&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="ss"&gt;:before_compile&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="ss"&gt;:input_files&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'${BUILT_PRODUCTS_DIR}/build_phony'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="ss"&gt;:output_files&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;__dir__&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;"/../src/cmake-build-macos/libdemo_library.a"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pod_target_xcconfig&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="s1"&gt;'DEFINES_MODULE'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'YES'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s1"&gt;'OTHER_LDFLAGS'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'-force_load '&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;__dir__&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s1"&gt;'/../src/cmake-build-macos/libdemo_library.a'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Remove the C++ Source Files Included in CocoaPods&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Don't forget to remove all contents in &lt;code&gt;&amp;lt;project&amp;gt;/macos/Classes/flutter_native_example.c&lt;/code&gt; to avoid duplicate symbols compile errors.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Test with &lt;code&gt;flutter run&lt;/code&gt; Command&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Now it's time to test our modified build scripts and see if everything is working well.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd example &amp;amp;&amp;amp; flutter run -d macos
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Migrating to iOS Platform Support
&lt;/h2&gt;

&lt;p&gt;The build configuration for iOS is very similar to macOS builds.&lt;/p&gt;

&lt;p&gt;Building for the iOS platform on macOS requires additional steps for configuring the cross-compilation toolchain.&lt;/p&gt;

&lt;p&gt;Use the following commands at the root of the project to get the &lt;code&gt;ios-cmake&lt;/code&gt; project and compile iOS targets using CMake:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git subtree add &lt;span class="nt"&gt;--prefix&lt;/span&gt; src/ios-cmake https://github.com/leetal/ios-cmake.git master &lt;span class="nt"&gt;--squash&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Add Shell Scripts to Build a Static Library for iOS&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Define the function for iOS build&lt;/span&gt;
build_ios&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="nv"&gt;BUILD_TYPE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;1&lt;/span&gt;&lt;span class="k"&gt;:-&lt;/span&gt;&lt;span class="nv"&gt;Debug&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
  &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"Building for iOS with &lt;/span&gt;&lt;span class="nv"&gt;$BUILD_TYPE&lt;/span&gt;&lt;span class="s2"&gt; mode"&lt;/span&gt;
  cmake &lt;span class="nt"&gt;-DPLATFORM&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;OS64COMBINED &lt;span class="nt"&gt;-DCMAKE_TOOLCHAIN_FILE&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nv"&gt;$BASEDIR&lt;/span&gt;/ios-cmake/ios.toolchain.cmake &lt;span class="nt"&gt;-G&lt;/span&gt; &lt;span class="s2"&gt;"Xcode"&lt;/span&gt; &lt;span class="nt"&gt;-B&lt;/span&gt; &lt;span class="nv"&gt;$BASEDIR&lt;/span&gt;/cmake-build-ios &lt;span class="nt"&gt;-S&lt;/span&gt; &lt;span class="nv"&gt;$BASEDIR&lt;/span&gt;/
  cmake &lt;span class="nt"&gt;--build&lt;/span&gt; &lt;span class="nv"&gt;$BASEDIR&lt;/span&gt;/cmake-build-ios &lt;span class="nt"&gt;--config&lt;/span&gt; &lt;span class="nv"&gt;$BUILD_TYPE&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run the following command: &lt;code&gt;./build_ios.sh Release&lt;/code&gt; or &lt;code&gt;./build_ios.sh ios Debug&lt;/code&gt; for debug purposes.&lt;/p&gt;

&lt;p&gt;The static library will be located in &lt;code&gt;&amp;lt;project&amp;gt;/src/cmake-build-ios/Debug-iphoneos&lt;/code&gt; with a Debug build and &lt;code&gt;&amp;lt;project&amp;gt;/src/cmake-build-ios/Release-iphoneos&lt;/code&gt; with a Release build variant.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Link CMake with CocoaPods in iOS&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Now it's time to modify &lt;code&gt;&amp;lt;project&amp;gt;/ios/flutter_native_example.podspec&lt;/code&gt; to add the build phase and connect our scripts with the CocoaPods build.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;prepare_command&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'bash build_ios.sh'&lt;/span&gt;
&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;script_phase&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="ss"&gt;:name&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'Trigger Native Build'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="c1"&gt;# First argument is relative path to the `rust` folder, second is name of rust library&lt;/span&gt;
  &lt;span class="ss"&gt;:script&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'ln -fs "$OBJROOT/XCBuildData/build.db" "${BUILT_PRODUCTS_DIR}/build_phony"'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="ss"&gt;:execution_position&lt;/span&gt;&lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="ss"&gt;:before_compile&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="ss"&gt;:input_files&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'${BUILT_PRODUCTS_DIR}/build_phony'&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
  &lt;span class="ss"&gt;:output_files&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;__dir__&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;"/../src/cmake-build-ios/$CONFIGURATION-iphoneos/libdemo_library.a"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;# Flutter.framework does not contain a i386 slice.&lt;/span&gt;
&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pod_target_xcconfig&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="s1"&gt;'DEFINES_MODULE'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'YES'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'EXCLUDED_ARCHS[sdk=iphonesimulator*]'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'i386'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s1"&gt;'OTHER_LDFLAGS'&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;'-force_load '&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;__dir__&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s1"&gt;'/../src/cmake-build-ios/$CONFIGURATION-iphoneos/libdemo_library.a'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Remove the C++ Source Files Included in CocoaPods&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Don't forget to remove all contents in &lt;code&gt;&amp;lt;project&amp;gt;/ios/Classes/flutter_native_example.c&lt;/code&gt; to avoid duplicate symbols compile errors.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Test with &lt;code&gt;flutter run&lt;/code&gt; Command&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Now it's time to test our modified build scripts and see if everything is working well.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;example &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; flutter run &lt;span class="nt"&gt;-d&lt;/span&gt; &amp;lt;device_id&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Compile for Android, Linux, and Windows
&lt;/h2&gt;

&lt;p&gt;The Flutter scaffold project already has good configuration for building on Android, Linux, and Windows using dynamic library loading.&lt;/p&gt;

&lt;h2&gt;
  
  
  Check the Demo and Try It Yourself
&lt;/h2&gt;

&lt;p&gt;All the code in this article is located in this GitHub repository:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/andycall/The_Comprehensive_Guide_to_Using_Cpp_in_Flutter/tree/main/Chapter-1" rel="noopener noreferrer"&gt;https://github.com/andycall/The_Comprehensive_Guide_to_Using_Cpp_in_Flutter/tree/main/Chapter-1&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Next Chapter
&lt;/h2&gt;

&lt;p&gt;In the next chapter, we will focus on debugging C/C++ code in Flutter apps across multiple platforms, using a range of development IDEs such as Xcode, Visual Studio, Android Studio, and CLion.&lt;/p&gt;

</description>
      <category>flutter</category>
      <category>cpp</category>
      <category>dart</category>
    </item>
  </channel>
</rss>
