【決定版】CMake: 変数「CMAKE_XCODE_SCHEME_DYNAMIC_LINKER_API_USAGE」でMacアプリの共有ライブラリ使用状況を徹底分析


CMAKE_XCODE_SCHEME_DYNAMIC_LINKER_API_USAGE は、CMake 3.13 以降で導入された変数です。この変数は、Xcode で生成されるスキームの "Diagnostics" セクションで、ダイナミックリンカー API 使用状況を表示するかどうかを制御します。

設定方法

この変数は、ターゲットを作成する際に設定できます。以下の例をご覧ください。

target_link_libraries(mytarget PRIVATE mylib)
set(CMAKE_XCODE_SCHEME_DYNAMIC_LINKER_API_USAGE ON)

上記の例では、mytarget ターゲットが mylib ライブラリにリンクされ、CMAKE_XCODE_SCHEME_DYNAMIC_LINKER_API_USAGE 変数が ON に設定されます。これにより、Xcode で mytarget ターゲットをビルドおよび実行すると、"Diagnostics" セクションにダイナミックリンカー API 使用状況が表示されます。

動作

CMAKE_XCODE_SCHEME_DYNAMIC_LINKER_API_USAGE 変数が ON に設定されている場合、Xcode で生成されるスキームの "Diagnostics" セクションには、以下の情報が表示されます。

  • 各ダイナミックライブラリによって使用される API 関数の一覧
  • ターゲットによって使用されるダイナミックライブラリの一覧

この情報は、デバッグやパフォーマンス分析に役立ちます。

  • この変数は、Xcode で生成されるスキームにのみ影響を与えます。他のビルドシステムでは使用できません。
  • この変数は、Xcode 3.13 以降でのみ使用できます。
  • "Diagnostics" セクションは、Xcode のウィンドウ下部に表示される領域です。この領域には、ビルドおよび実行に関する情報が表示されます。
  • ダイナミックリンカー API は、macOS および iOS で共有ライブラリをロードおよびアンロードするために使用される API です。


cmake_minimum_required(VERSION 3.13)

project(myproject)

set(CMAKE_XCODE_SCHEME_DYNAMIC_LINKER_API_USAGE ON)

add_executable(mytarget mytarget.c)
target_link_libraries(mytarget mylib)

このコードを実行すると、以下のようになります。

  1. myproject という名前のプロジェクトが作成されます。
  2. mytarget という名前の実行可能ファイルが作成されます。
  3. mytarget 実行可能ファイルは、mylib ライブラリにリンクされます。
  4. Xcode で mytarget ターゲットをビルドおよび実行すると、"Diagnostics" セクションにダイナミックリンカー API 使用状況が表示されます。
  • target_link_libraries(mytarget mylib) : mytarget 実行可能ファイルを mylib ライブラリにリンクします。
  • add_executable(mytarget mytarget.c) : mytarget.c ファイルから mytarget という名前の実行可能ファイルを作成します。
  • set(CMAKE_XCODE_SCHEME_DYNAMIC_LINKER_API_USAGE ON) : CMAKE_XCODE_SCHEME_DYNAMIC_LINKER_API_USAGE 変数を ON に設定します。
  • project(myproject) : myproject という名前のプロジェクトを作成します。
  • cmake_minimum_required(VERSION 3.13) : CMake バージョン 3.13 以降が必要であることを指定します。
  • mylib ライブラリは、実際に存在するライブラリに置き換える必要があります。
  • このコードは、macOS または iOS でコンパイルする必要があります。


otool コマンドを使用する

otool コマンドは、macOS および iOS で共有ライブラリに関する情報を表示するために使用できるコマンドラインツールです。このコマンドを使用して、ダイナミックリンカー API 使用状況を表示することもできます。

otool -v mytarget

上記の例では、mytarget 実行可能ファイルに関する情報が表示されます。この情報には、実行可能ファイルによって使用されるダイナミックライブラリの一覧と、各ダイナミックライブラリによって使用される API 関数の一覧が含まれます。

DYLD_PRINT_ADDR 環境変数を使用する

DYLD_PRINT_ADDR 環境変数は、共有ライブラリによってロードされたアドレスと、各アドレスでロードされた API 関数の名前を表示するために使用できます。この環境変数を設定するには、以下のコマンドを実行します。

DYLD_PRINT_ADDR=1 ./mytarget

上記の例では、mytarget 実行可能ファイルを実行し、DYLD_PRINT_ADDR 環境変数を 1 に設定します。これにより、実行可能ファイルによってロードされた共有ライブラリに関する情報が表示されます。

デバッガーを使用する

LLDB や GDB などのデバッガーを使用して、ダイナミックリンカー API 使用状況をデバッグすることもできます。これらのデバッガーには、共有ライブラリによってロードされたアドレスと、各アドレスでロードされた API 関数の名前を表示する機能があります。

静的リンクを使用する

ダイナミックリンカー API 使用状況を心配する場合は、静的リンクを使用して、実行可能ファイルに必要なすべてのライブラリを埋め込むことができます。これにより、実行可能ファイルのサイズが大きくなりますが、ダイナミックライブラリに依存しなくなるため、ダイナミックリンカー API 使用状況を心配する必要がなくなります。

CMAKE_XCODE_SCHEME_DYNAMIC_LINKER_API_USAGE 変数は、Xcode で生成されるスキームの "Diagnostics" セクションにダイナミックリンカー API 使用状況を表示するための便利な方法ですが、上記のように、いくつかの代替方法もあります。どの方法を使用するかは、ニーズと好みによります。

  • 静的リンクは、すべてのオペレーティングシステムで使用できます。
  • デバッガーは、macOS、iOS、Linux、および Windows など、さまざまなオペレーティングシステムで使用できます。
  • otool コマンドと DYLD_PRINT_ADDR 環境変数は、macOS および iOS でのみ使用できます。