Bagikan melalui


/scanDependencies (Mencantumkan dependensi modul dalam bentuk standar)

Opsi kompilator ini menghasilkan file JSON yang mencantumkan dependensi modul dan header-unit sesuai dengan proposal P1689R5 Format for describing dependencies of source filesStandar C++ .

Sintaks

/scanDependencies-
/scanDependencies filename
/scanDependencies directory

Argumen

-
Jika tanda hubung tunggal disediakan, pengkompilasi memancarkan dependensi sumber JSON ke stdout, atau ke tempat output kompilator dialihkan.

filename
Pengkompilasi menulis output dependensi sumber ke nama file yang ditentukan, yang mungkin menyertakan jalur relatif atau absolut. File dibuat jika tidak ada.

directory
Jika argumen adalah direktori, pengkompilasi menghasilkan file dependensi sumber di direktori yang ditentukan. Direktori harus ada, atau argumen diperlakukan sebagai filename. Nama file output didasarkan pada nama lengkap file input, dengan ekstensi yang ditambahkan .module.json . Misalnya, jika file yang disediakan untuk pengkompilasi adalah main.cpp, nama file output yang dihasilkan adalah main.cpp.module.json.

Keterangan

Opsi /scanDependencies kompilator mengidentifikasi dependensi, modul, dan unit header mana yang harus dikompilasi sebelum Anda dapat mengkompilasi proyek yang menggunakannya. Misalnya, daftar import <library>; atau import "library"; sebagai dependensi unit header, dan import name; sebagai dependensi modul. Tujuannya adalah untuk memberikan informasi ini dalam format umum yang dapat dikonsumsi oleh alat build seperti CMake. Untuk melaporkan dependensi modul dan unit header, Anda juga harus mengkompilasi dengan menggunakan /std:c++20 atau yang lebih baru.

Opsi baris perintah ini mirip /sourceDependencies:directives dengan dan /sourceDependencies, tetapi berbeda dengan cara berikut:

  • Output menggunakan P1689R5 skema, alih-alih skema khusus Microsoft yang dihasilkan oleh /sourceDependencies:directives.
  • Tidak seperti /sourceDependencies, pengkompilasi tidak menghasilkan output yang dikompilasi. Sebagai gantinya, file dipindai untuk arahan modul. Tidak ada kode, modul, atau unit header yang dikompilasi yang diproduksi.
  • File JSON output tidak mencantumkan modul yang diimpor dan unit header (.ifc file) yang diimpor karena opsi ini hanya memindai file proyek. Tidak ada modul atau unit header bawaan untuk dicantumkan.
  • Hanya modul atau unit header yang diimpor langsung yang tercantum. Ini tidak mencantumkan dependensi modul atau unit header yang diimpor itu sendiri.
  • File header yang disertakan secara tekstual seperti #include <file> atau #include "file" tidak tercantum sebagai dependensi kecuali diterjemahkan ke unit header dengan menggunakan /translateInclude opsi .
  • /scanDependencies dimaksudkan untuk digunakan sebelum .ifc file dibuat.

/scanDependencies tersedia mulai dari Visual Studio 2022 versi 17.2. Perlindungan pembersihan tidak diaktifkan secara default.

Saat Anda menentukan /MP opsi pengkompilasi (Build dengan beberapa proses), kami sarankan Anda menggunakan /scanDependencies dengan argumen direktori. Jika Anda memberikan argumen nama file tunggal, dua instans pengompilasi dapat mencoba membuka file output secara bersamaan dan menyebabkan kesalahan. Penggunaan /MP dengan /scanDependencies- untuk mengirim output dapat stdout menyebabkan hasil yang saling terkait.

Ketika kesalahan kompilator non-fatal terjadi, informasi dependensi masih ditulis ke file output.

Semua jalur file muncul sebagai jalur absolut dalam output.

Untuk detail tentang format dan skema yang digunakan dalam file JSON output, lihat P1689R5 bagian 6.

Contoh

Pertimbangkan kode sampel berikut:

//app.cpp:
#include <vector>

import other.module;
import std.core;

import "t.h";

import <iostream>;

int main() {}

Anda dapat menggunakan baris perintah ini untuk melaporkan dependensi di app.cpp:

cl /std:c++latest /scanDependencies output.json app.cpp

Pengkompilasi menghasilkan file JSON, output.json, dengan konten yang mirip dengan:

{
    "version": 1,
    "revision": 0,
    "rules": [
        {
            "primary-output": "app.obj",
            "outputs": [
                "C:\\Users\\username\\source\\repos\\app\\app"
            ],
            "requires": [
                {
                    "logical-name": "other.module"
                },
                {
                    "logical-name": "std.core"
                },
                {
                    "logical-name": "t.h",
                    "source-path": "C:\\Users\\username\\source\\repos\\app\\app\\t.h",
                    "lookup-method": "include-quote",
                    "unique-on-source-path": true
                },
                {
                    "logical-name": "iostream",
                    "source-path": "C:\\Program Files\\...\\include\\iostream",
                    "lookup-method": "include-angle",
                    "unique-on-source-path": true
                }
            ]
        }
    ]
}

Kami telah menggunakan ... untuk menyingkat jalur yang dilaporkan. Laporan berisi jalur absolut. Jalur yang dilaporkan bergantung pada di mana pengkompilasi menemukan dependensi. Jika hasilnya tidak terduga, Anda mungkin ingin memeriksa pengaturan jalur sertakan proyek Anda.

Tidak ada .ifc file yang tercantum dalam output karena tidak dibuat. Tidak seperti /sourceDependencies, kompilator tidak menghasilkan output yang dikompilasi ketika /scanDependencies ditentukan, sehingga tidak ada modul atau unit header yang dikompilasi yang diproduksi untuk diimpor.

Untuk mengatur opsi pengkompilasi ini di Visual Studio

Anda biasanya tidak boleh mengatur /scanDependencies opsi di lingkungan pengembangan Visual Studio. Pengkompilasi tidak menghasilkan file objek saat Anda mengatur opsi ini, yang membuat langkah tautan gagal dan melaporkan kesalahan.

  1. Buka kotak dialog Halaman Properti proyek. Untuk informasi selengkapnya, lihat Mengatur properti kompilator dan build.

  2. Pilih halaman properti Properti>Konfigurasi C/C++>Baris Perintah.

  3. Ubah properti Opsi Tambahan untuk menambahkan /scanDependencies- atau /scanDependencies "pathname", di mana "pathname" merujuk ke direktori untuk output.

  4. Pilih OK untuk menyimpan perubahan.

Untuk melaporkan dependensi modul dan unit header, Anda juga harus mengatur properti Properti>Konfigurasi Umum>C++ Standar Bahasa ke ISO C++20 Standar atau yang lebih baru.

Untuk mengatur opsi pengkompilasi ini secara terprogram

Lihat juga

Opsi pengkompilasi MSVC
Sintaks baris perintah pengkompilasi MSVC
/sourceDependencies:directives
/sourceDependencies
/std (Tentukan versi standar bahasa)
/translateInclude