<?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>DEV Community: Neha Chauhan</title>
    <description>The latest articles on DEV Community by Neha Chauhan (@nehachauhan18).</description>
    <link>https://dev.to/nehachauhan18</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4076568%2Fda699873-4c7e-43ad-8da0-8cd7d6323f63.png</url>
      <title>DEV Community: Neha Chauhan</title>
      <link>https://dev.to/nehachauhan18</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/nehachauhan18"/>
    <language>en</language>
    <item>
      <title>From Intel Mac to Apple Silicon: How I Built Universal Third-Party Libraries for a Qt macOS Application</title>
      <dc:creator>Neha Chauhan</dc:creator>
      <pubDate>Thu, 13 Aug 2026 16:18:31 +0000</pubDate>
      <link>https://dev.to/nehachauhan18/from-intel-mac-to-apple-silicon-how-i-built-universal-third-party-libraries-for-a-qt-macos-1moo</link>
      <guid>https://dev.to/nehachauhan18/from-intel-mac-to-apple-silicon-how-i-built-universal-third-party-libraries-for-a-qt-macos-1moo</guid>
      <description>&lt;p&gt;When I started developing my macOS application, my development machine was an &lt;strong&gt;Intel-based Mac&lt;/strong&gt;. At that time, most of my third-party libraries were built specifically for the &lt;code&gt;x86_64&lt;/code&gt; architecture.&lt;/p&gt;

&lt;p&gt;Everything worked perfectly.&lt;/p&gt;

&lt;p&gt;Then came the transition to &lt;strong&gt;Apple Silicon (ARM64)&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;My requirement was simple:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Build one macOS application that can run natively on both Intel and Apple Silicon Macs.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;In practice, however, this turned into a much bigger build and dependency-management problem.&lt;/p&gt;

&lt;p&gt;This is the story of how I approached that migration and eventually rebuilt my third-party dependencies as &lt;strong&gt;Universal 2 libraries&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Original Setup
&lt;/h2&gt;

&lt;p&gt;My original development environment looked roughly like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Intel Mac
   │
   ├── Qt libraries
   ├── Third-party libraries
   │      ├── Library A → x86_64
   │      ├── Library B → x86_64
   │      ├── Library C → x86_64
   │      └── Library D → x86_64
   │
   └── Application → x86_64
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Because everything was built for Intel, there was no architecture mismatch.&lt;/p&gt;

&lt;p&gt;The application compiled, linked and ran normally.&lt;/p&gt;

&lt;p&gt;The problem appeared when I wanted the same application to run natively on Apple Silicon.&lt;/p&gt;




&lt;h1&gt;
  
  
  The Goal: One Application for Both Architectures
&lt;/h1&gt;

&lt;p&gt;The desired architecture was:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                    Universal Application
                           │
              ┌────────────┴────────────┐
              │                         │
           x86_64                     arm64
              │                         │
         Intel Mac               Apple Silicon Mac
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The application itself needed to contain both architectures.&lt;/p&gt;

&lt;p&gt;But there was an important dependency:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Every native library used by the application also needed to support the architectures required by the final application.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Simply making the application universal wasn't enough.&lt;/p&gt;




&lt;h1&gt;
  
  
  Why My Existing Libraries Were Not Enough
&lt;/h1&gt;

&lt;p&gt;Suppose a third-party library contained only:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;x86_64
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and my application was built as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;x86_64 + arm64
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The linker could use that library when building the Intel portion of the application.&lt;/p&gt;

&lt;p&gt;But it couldn't use the same binary to produce the ARM64 portion.&lt;/p&gt;

&lt;p&gt;Conceptually:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Application
├── x86_64  ──────&amp;gt; Library x86_64     ✅
└── arm64   ──────&amp;gt; Library x86_64     ❌
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I therefore needed to rebuild the dependencies.&lt;/p&gt;

&lt;p&gt;The target became:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Library
├── x86_64
└── arm64
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is what is commonly referred to as a &lt;strong&gt;Universal 2&lt;/strong&gt; binary on macOS.&lt;/p&gt;




&lt;h1&gt;
  
  
  Building the Libraries for Both Architectures
&lt;/h1&gt;

&lt;p&gt;The approach I eventually adopted was to build the third-party libraries separately for each architecture.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Library A
│
├── Build x86_64
│
└── Build arm64
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then combine the resulting binaries into a universal binary.&lt;/p&gt;

&lt;p&gt;For libraries that produce Mach-O binaries, Apple's &lt;code&gt;lipo&lt;/code&gt; tool is useful for this.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;lipo &lt;span class="nt"&gt;-create&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
    build-x86_64/libMyLibrary.dylib &lt;span class="se"&gt;\&lt;/span&gt;
    build-arm64/libMyLibrary.dylib &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;-output&lt;/span&gt; libMyLibrary.dylib
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now the resulting library contains both architectures.&lt;/p&gt;

&lt;p&gt;You can verify it using:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;lipo &lt;span class="nt"&gt;-info&lt;/span&gt; libMyLibrary.dylib
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A successful result should indicate both:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Architectures in the fat file:
x86_64
arm64
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  The Important Part: Don't Just Build the Final Library
&lt;/h1&gt;

&lt;p&gt;One mistake that is easy to make during this migration is thinking only about the final &lt;code&gt;.dylib&lt;/code&gt; or &lt;code&gt;.framework&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;A dependency can itself depend on other libraries.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;MyApplication
      │
      ▼
   Library A
      │
      ├── Library B
      │      │
      │      └── Library C
      │
      └── Library D
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If Library A is universal but Library B is only &lt;code&gt;x86_64&lt;/code&gt;, the application can still fail to build or run for ARM64.&lt;/p&gt;

&lt;p&gt;Therefore, I had to look at the &lt;strong&gt;entire dependency chain&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The real target became:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Application
│
├── Qt
│
├── Library A
│   ├── Library B
│   └── Library C
│
└── Library D
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Every native component in that chain needed to support the required architectures.&lt;/p&gt;




&lt;h1&gt;
  
  
  The Qt Complication
&lt;/h1&gt;

&lt;p&gt;Since my application was based on Qt, the situation became more interesting.&lt;/p&gt;

&lt;p&gt;It wasn't enough to make only my own third-party libraries universal.&lt;/p&gt;

&lt;p&gt;Qt itself had to be built correctly for the target architectures.&lt;/p&gt;

&lt;p&gt;The Qt configuration and build process therefore became an important part of the migration.&lt;/p&gt;

&lt;p&gt;I also had to deal with components such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Qt WebEngine&lt;/li&gt;
&lt;li&gt;Qt WebView&lt;/li&gt;
&lt;li&gt;Qt PDF&lt;/li&gt;
&lt;li&gt;WebRTC&lt;/li&gt;
&lt;li&gt;proprietary codecs&lt;/li&gt;
&lt;li&gt;Chromium dependencies&lt;/li&gt;
&lt;li&gt;macOS frameworks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This significantly increased the complexity compared with a simple C++ application.&lt;/p&gt;




&lt;h1&gt;
  
  
  Debugging Architecture Problems
&lt;/h1&gt;

&lt;p&gt;One of the most useful things I learned during this process was:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Always check the architecture of the actual binary you are linking.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;file MyLibrary.dylib
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;lipo &lt;span class="nt"&gt;-info&lt;/span&gt; MyLibrary.dylib
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For frameworks:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;file MyFramework.framework/MyFramework
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This immediately tells you whether the binary contains:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;x86_64
arm64
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;or only one of them.&lt;/p&gt;

&lt;p&gt;This simple check can save a lot of debugging time.&lt;/p&gt;




&lt;h1&gt;
  
  
  What About Rosetta?
&lt;/h1&gt;

&lt;p&gt;During the migration, I also came across &lt;strong&gt;Rosetta 2&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Rosetta allows Intel (&lt;code&gt;x86_64&lt;/code&gt;) applications to run on Apple Silicon Macs by translating Intel instructions for the ARM processor.&lt;/p&gt;

&lt;p&gt;This is extremely useful for running older applications.&lt;/p&gt;

&lt;p&gt;However, Rosetta doesn't magically convert an Intel development environment into a native ARM development environment.&lt;/p&gt;

&lt;p&gt;There is an important distinction:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Intel application
        │
        ▼
Rosetta
        │
        ▼
Apple Silicon
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;versus:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Universal application
        │
        ├── x86_64 → Intel Mac
        │
        └── arm64  → Apple Silicon
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For a professional application, I wanted the second approach.&lt;/p&gt;




&lt;h1&gt;
  
  
  Archive and Release Builds Are Another Story
&lt;/h1&gt;

&lt;p&gt;One of the biggest lessons from this migration was:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;A successful Debug build does not necessarily mean that the final distributable application is correct.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Development builds, Archive builds and packaged applications can involve different paths, signing, frameworks and dependency handling.&lt;/p&gt;

&lt;p&gt;This became particularly important when I started using Xcode's:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Archive&lt;/li&gt;
&lt;li&gt;Analyze&lt;/li&gt;
&lt;li&gt;Release configuration&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Some problems appeared only after the application was archived.&lt;/p&gt;

&lt;p&gt;This forced me to inspect the final application bundle rather than trusting the build result alone.&lt;/p&gt;




&lt;h1&gt;
  
  
  Always Inspect the Final &lt;code&gt;.app&lt;/code&gt;
&lt;/h1&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;find MyApplication.app &lt;span class="nt"&gt;-type&lt;/span&gt; f
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then inspect important binaries:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;file MyApplication.app/Contents/MacOS/MyApplication
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;lipo &lt;span class="nt"&gt;-info&lt;/span&gt; MyApplication.app/Contents/MacOS/MyApplication
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I also recommend checking embedded frameworks and dynamic libraries individually.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;find MyApplication.app/Contents/Frameworks &lt;span class="nt"&gt;-type&lt;/span&gt; f
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then inspect suspicious binaries.&lt;/p&gt;

&lt;p&gt;The goal is to ensure that the final application actually contains what you think it contains.&lt;/p&gt;




&lt;h1&gt;
  
  
  Universal Does Not Mean Everything Is Automatically Fixed
&lt;/h1&gt;

&lt;p&gt;Another important lesson:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Universal binaries solve architecture compatibility, not every macOS compatibility problem.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You can have:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;arm64
x86_64
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;in every library and still have problems involving:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;incorrect install names&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@rpath&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;missing frameworks&lt;/li&gt;
&lt;li&gt;code signing&lt;/li&gt;
&lt;li&gt;hardened runtime&lt;/li&gt;
&lt;li&gt;embedded dependencies&lt;/li&gt;
&lt;li&gt;incompatible deployment targets&lt;/li&gt;
&lt;li&gt;incorrect framework packaging&lt;/li&gt;
&lt;li&gt;plugins&lt;/li&gt;
&lt;li&gt;architecture-specific resources&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Therefore, architecture verification should be treated as &lt;strong&gt;one stage of the release process&lt;/strong&gt;, not the entire solution.&lt;/p&gt;




&lt;h1&gt;
  
  
  My Final Build Strategy
&lt;/h1&gt;

&lt;p&gt;The approach that worked best for me was essentially:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                Source Code
                     │
          ┌──────────┴──────────┐
          │                     │
       x86_64                 arm64
          │                     │
    Build dependencies    Build dependencies
          │                     │
          └──────────┬──────────┘
                     │
                Combine
                     │
                Universal
                     │
                     ▼
             Qt Application
                     │
                     ▼
              Final .app
                     │
             ┌───────┴────────┐
             │                │
         Intel Mac       Apple Silicon
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The important thing is to make the &lt;strong&gt;entire dependency chain&lt;/strong&gt; consistent.&lt;/p&gt;




&lt;h1&gt;
  
  
  Lessons I Learned
&lt;/h1&gt;

&lt;h3&gt;
  
  
  1. Don't wait until the end to test ARM64
&lt;/h3&gt;

&lt;p&gt;Build and test ARM64 early.&lt;/p&gt;

&lt;p&gt;The earlier you discover an architecture-specific dependency, the easier it is to fix.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Keep separate build directories
&lt;/h3&gt;

&lt;p&gt;I found it much cleaner to maintain separate builds:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;build-x86_64/
build-arm64/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and combine them only when required.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Verify every important binary
&lt;/h3&gt;

&lt;p&gt;Use:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;file
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;lipo &lt;span class="nt"&gt;-info&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Don't assume a library is universal just because the application is universal.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Check transitive dependencies
&lt;/h3&gt;

&lt;p&gt;Your library can be universal while one of its dependencies isn't.&lt;/p&gt;

&lt;p&gt;Always inspect the dependency tree.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Test the packaged application
&lt;/h3&gt;

&lt;p&gt;Don't stop at:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Build succeeded
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Test the actual:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Archive → Export → Install → Run
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;application.&lt;/p&gt;




&lt;h1&gt;
  
  
  Final Thoughts
&lt;/h1&gt;

&lt;p&gt;Moving from an Intel Mac development environment to Apple Silicon is not simply a matter of changing:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;x86_64
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;arm64
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For applications with many native dependencies—especially Qt-based desktop applications—the migration can involve rebuilding a significant portion of the dependency stack.&lt;/p&gt;

&lt;p&gt;In my case, rebuilding the third-party libraries as &lt;strong&gt;Universal 2 libraries&lt;/strong&gt; was an important step toward producing a single application capable of running on both Intel and Apple Silicon Macs.&lt;/p&gt;

&lt;p&gt;The biggest lesson was simple:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Don't think of Universal 2 as an application setting. Think of it as a dependency-chain strategy.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Once you understand that, debugging architecture problems becomes much more systematic.&lt;/p&gt;

&lt;p&gt;And when something fails, the first questions I now ask are:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;file &amp;lt;binary&amp;gt;
lipo &lt;span class="nt"&gt;-info&lt;/span&gt; &amp;lt;binary&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Those two commands can tell you a surprising amount about what's really inside your application.&lt;/p&gt;

</description>
      <category>software</category>
      <category>softwaredevelopment</category>
      <category>softwareengineering</category>
    </item>
  </channel>
</rss>
