配置文件binding.gpy说明

本篇逐步说明binding.gpy常用字段,与字段含义。

 同系列参考文章

Electron调用C++函数-CSDN博客

node-gpy工具说明-CSDN博客

配置文件binding.gpy说明-CSDN博客

Electorn-C++代码示例-CSDN博客

binding.gpy文件模板

文件代码

{
  "variables": {
    # 变量部分:用于定义构建过程中使用的变量
    # 这些变量可以在整个文件中被引用,以避免硬编码和重复
  },
  "includes": [
    "../build/common.gypi"
    # 包含部分:引用外部的 GYP 文件,将其内容包含到当前 GYP 文件中
    # 这种方法可以重用公共配置,如通用变量、设置等
  ],
  "target_defaults": {
    # 目标默认值:定义构建目标的默认配置
    # 这些配置会应用到所有的构建目标中,可以在具体目标中被覆盖
  },
  "targets": [
    {
      "target_name": "target_1",
      # 构建目标 1 的配置
      # target_name:目标名称,用于标识这个构建目标
    },
    {
      "target_name": "target_2",
      # 构建目标 2 的配置
      # target_name:目标名称,用于标识这个构建目标
    }
  ],
  "conditions": [
    ["OS=='linux'", {
      "targets": [
        {
          "target_name": "linux_target_3"
          # 在 Linux 操作系统上特定的构建目标
          # target_name:目标名称,用于标识这个构建目标
        }
      ]
    }],
    ["OS=='win'", {
      "targets": [
        {
          "target_name": "windows_target_4"
          # 在 Windows 操作系统上特定的构建目标
          # target_name:目标名称,用于标识这个构建目标
        }
      ]
    }],
    ["OS=='mac'", {
      "targets": [
        {
          "target_name": "macos_target_5"
          # 在 macOS 操作系统上特定的构建目标
          # target_name:目标名称,用于标识这个构建目标
        }
      ]
    }]
  ]
}

字段说明

  • variables: 可以在文件的其他各个部分插入和使用的变量的定义。
  • includes: 将包含在此文件中的其他文件的列表。
  • target_defaults: 定义所有目标的默认配置,可以在每个目标中被覆盖。
  • targets: 定义了两个基本目标 target_1 和 target_2。
  • conditions: 根据操作系统定义不同的目标

binding.gpy可执行程序模板

文件代码

{
  "targets": [
    {
      "target_name": "foo",  # 构建目标的名称
      "type": "executable",  # 目标类型,这里指定为可执行文件
      "msvs_guid": "5ECEC9E5-8F23-47B6-93E0-C3B328B3BE65",  # 在 Visual Studio 中的项目 GUID
      "dependencies": [  # 目标的依赖项
        "xyzzy",  # 依赖的其他构建目标
        "../bar/bar.gyp:bar",  # 依赖于另一个 GYP 文件中的目标
      ],
      "defines": [  # 预处理器定义
        "DEFINE_FOO",  # 定义宏 `DEFINE_FOO`
        "DEFINE_A_VALUE=value",  # 定义宏 `DEFINE_A_VALUE` 并赋值为 `value`
      ],
      "include_dirs": [  # 包含的头文件目录
        "..",  # 包含父目录
      ],
      "sources": [  # 源文件列表
        "file1.cc",  # 源文件 `file1.cc`
        "file2.cc",  # 源文件 `file2.cc`
      ],
      "conditions": [  # 根据条件设置不同的配置
        ["OS=='linux'", {  # 针对 Linux 系统的配置
          "defines": [  # Linux 特定的预处理器定义
            "LINUX_DEFINE",  # 定义宏 `LINUX_DEFINE`
          ],
          "include_dirs": [  # Linux 特定的包含目录
            "include/linux",  # 包含目录 `include/linux`
          ],
        }],
        ["OS=='win'", {  # 针对 Windows 系统的配置
          "defines": [  # Windows 特定的预处理器定义
            "WINDOWS_SPECIFIC_DEFINE",  # 定义宏 `WINDOWS_SPECIFIC_DEFINE`
          ],
        }]
      ],
    },
  ],
}

字段说明

  • targets: 定义了一个构建目标 foo。
  • target_name: 目标名称是 foo。
  • type: 目标类型是可执行文件。static_library 静态库、executable 可执行文件、shared_library 动态库
  • msvs_guid: Visual Studio 项目的 GUID。这只是过渡性的。这是一个硬编码的 GUID 值,将在生成的 Visual Studio 解决方案文件中使用。这使我们能够签入chrome.sln与 gyp 生成的项目文件互操作的文件。一旦 Chromium 中的所有内容都由 gyp 生成,GUID 在调用过程中保持不变就不再重要了
  • dependencies: 目标依赖于 xyzzy 和 ../bar/bar.gyp 文件中的 bar 目标。
  • defines: 预处理器定义,包括 DEFINE_FOO 和 DEFINE_A_VALUE=value。
  • include_dirs: 包含头文件所在的目录。
  • sources: 源文件列表,包括 file1.cc 和 file2.cc。
  • conditions: 根据不同操作系统设置不同的配置:
    • 在 Linux 系统上,定义了宏 LINUX_DEFINE 并包含目录 include/linux。
    • 在 Windows 系统上,定义了宏 WINDOWS_SPECIFIC_DEFINE。

binding.gpy库目标模板

文件代码

{
  "targets": [
    {
      "target_name": "foo",
      "type": "<(library)",  # 指定生成的目标类型,例如静态库(static_library)或动态库(shared_library)。
      "msvs_guid": "5ECEC9E5-8F23-47B6-93E0-C3B328B3BE65",  # MSVS项目的GUID,只在Windows上使用。
      "dependencies": [
        "xyzzy",  # 当前目标的依赖项,可以是其他目标名称。
        "../bar/bar.gyp:bar"  # 另一个GYP文件中的目标依赖项。
      ],
      "defines": [
        "DEFINE_FOO",  # 预处理器定义,定义宏 'DEFINE_FOO'。
        "DEFINE_A_VALUE=value"  # 预处理器定义并赋值宏 'DEFINE_A_VALUE'。
      ],
      "include_dirs": [
        ".."  # 指定包含路径,编译器将搜索这些目录以查找头文件。
      ],
      "direct_dependent_settings": {  # 直接依赖此目标的其他目标所继承的设置。
        "defines": [
          "DEFINE_FOO",  # 直接依赖此目标的目标将继承此定义。
          "DEFINE_ADDITIONAL"  # 另一个直接依赖定义。
        ],
        "linkflags": []  # 链接器标志,可以在此处添加特定的链接器选项。
      },
      "export_dependent_settings": [  # 导出的依赖设置,指定此目标所依赖的其他目标。
        "../bar/bar.gyp:bar"
      ],
      "sources": [
        "file1.cc",  # 要编译的源文件。
        "file2.cc"
      ],
      "conditions": [
        ["OS=='linux'", {  # 当操作系统为 Linux 时,应用以下设置。
          "defines": [
            "LINUX_DEFINE"  # 仅在 Linux 上定义的宏。
          ],
          "include_dirs": [
            "include/linux"  # 仅在 Linux 上的包含路径。
          ]
        }],
        ["OS=='win'", {  # 当操作系统为 Windows 时,应用以下设置。
          "defines": [
            "WINDOWS_SPECIFIC_DEFINE"  # 仅在 Windows 上定义的宏。
          ]
        }, {  # 非 Windows 平台时,应用以下设置。
          "defines": [
            "NON_WINDOWS_DEFINE"  # 非 Windows 平台定义的宏。
          ]
        }],
        ["OS=='mac'", {  # 当操作系统为 macOS 时,应用以下设置。
          "defines": [
            "MACOS_DEFINE"  # 仅在 macOS 上定义的宏。
          ],
          "include_dirs": [
            "include/macos"  # 仅在 macOS 上的包含路径。
          ]
        }]
      ]
    }
  ]
}

字段说明

targets:包含构建目标的数组,每个目标都是一个对象。

target_name:目标的名称。

type:目标类型,例如 executable(可执行文件)、static_library(静态库)或 shared_library(动态库)。在这里使用 <(library) 作为占位符。

msvs_guid:Microsoft Visual Studio 项目的 GUID,仅在 Windows 平台上使用。

dependencies:当前目标依赖的其他目标或文件,可以是同一个 GYP 文件中的其他目标,也可以是其他 GYP 文件中的目标。

defines:预处理器定义的宏,编译器会在所有源文件中定义这些宏。

include_dirs:编译器搜索头文件的目录。

direct_dependent_settings:直接依赖此目标的其他目标将继承的设置。

defines:直接依赖此目标的目标将继承的预处理器宏定义。

linkflags:链接器标志,可以在此添加特定的链接器选项。

export_dependent_settings:导出的依赖设置,指定此目标所依赖的其他目标。

sources:要编译的源文件列表。

conditions:条件编译,根据不同的平台设置不同的编译选项。

一些特殊用法

特定名称的文件

添加特定于平台的源文件的最简单方法是使用以下标准后缀之一(假设您要添加一个全新的文件并为其命名):

  • xx_linux (例如foo_linux.cc)
  • xx_mac (例如foo_mac.cc)
  • xx_posix (例如foo_posix.cc)
  • xx_win (例如foo_win.cc)

说明:如果源文件名字为foo_mac.cc,foo_mac.cc文件将自动从非macOS版本的源列表删除

指定命令

<!@(command):执行指定的命令,并将其输出作为值。在 include_dirs 中使用可以动态获取 Node.js 头文件路径

构建文件示例

与平台无关的构建

{
  "targets": [
    {
      "target_name": "new_unit_tests",  # 目标的名称
      "type": "executable",  # 目标类型,指定生成的目标为可执行文件
      "defines": [
        "FOO"  # 预处理器定义,定义了宏 FOO
      ],
      "include_dirs": [
        ".."  # 包含目录,编译器会在此目录中搜索头文件
      ],
      "dependencies": [
        "other_target_in_this_file",  # 当前 GYP 文件中的其他目标
        "other_gyp2:target_in_other_gyp2"  # 其他 GYP 文件中的目标
      ],
      "sources": [
        "new_additional_source.cc",  # 要编译的源文件
        "new_unit_tests.cc"  # 要编译的源文件
      ]
    }
  ]
}

特殊平台的构建

{
  "targets": [],  # 主目标数组是空的,因为所有目标都在 conditions 中定义
  "conditions": [
    [
      "OS==\"win\"",  # 如果操作系统是 Windows
      {
        "targets": [
          {
            "target_name": "new_unit_tests",  # 目标名称
            "type": "executable",  # 目标类型是可执行文件
            "defines": [
              "FOO"  # 预处理器宏定义
            ],
            "include_dirs": [
              ".."  # 包含的目录(上一级目录)
            ],
            "dependencies": [
              "other_target_in_this_file",  # 当前 GYP 文件中的另一个目标
              "other_gyp2:target_in_other_gyp2"  # 位于另一个 GYP 文件 other_gyp2 中的目标 target_in_other_gyp2
            ],
            "sources": [
              "new_additional_source.cc",  # 要编译的源文件
              "new_unit_tests.cc"  # 要编译的源文件
            ]
          }
        ]
      }
    ],
    [
      "OS==\"linux\"",  # 如果操作系统是 Linux
      {
        "targets": [
          {
            "target_name": "new_unit_tests",  # 目标名称
            "type": "executable",  # 目标类型是可执行文件
            "defines": [
              "FOO",  # 预处理器宏定义
              "LINUX_DEFINE"  # 仅在 Linux 平台上定义的宏
            ],
            "include_dirs": [
              "..",  # 包含的目录(上一级目录)
              "include/linux"  # 仅在 Linux 平台上包含的目录
            ],
            "dependencies": [
              "other_target_in_this_file",  # 当前 GYP 文件中的另一个目标
              "other_gyp2:target_in_other_gyp2"  # 位于另一个 GYP 文件 other_gyp2 中的目标 target_in_other_gyp2
            ],
            "sources": [
              "new_additional_source.cc",  # 要编译的源文件
              "new_unit_tests.cc"  # 要编译的源文件
            ]
          }
        ]
      }
    ],
    [
      "OS==\"mac\"",  # 如果操作系统是 macOS
      {
        "targets": [
          {
            "target_name": "new_unit_tests",  # 目标名称
            "type": "executable",  # 目标类型是可执行文件
            "defines": [
              "FOO",  # 预处理器宏定义
              "MACOS_DEFINE"  # 仅在 macOS 平台上定义的宏
            ],
            "include_dirs": [
              "..",  # 包含的目录(上一级目录)
              "include/macos"  # 仅在 macOS 平台上包含的目录
            ],
            "dependencies": [
              "other_target_in_this_file",  # 当前 GYP 文件中的另一个目标
              "other_gyp2:target_in_other_gyp2"  # 位于另一个 GYP 文件 other_gyp2 中的目标 target_in_other_gyp2
            ],
            "sources": [
              "new_additional_source.cc",  # 要编译的源文件
              "new_unit_tests.cc"  # 要编译的源文件
            ]
          }
        ]
      }
    ]
  ]
}

添加宏定义

{
  "targets": [
    {
      "target_name": "existing_target",  # 目标名称
      "defines": [
        "FOO",  # 预处理器宏定义,定义了宏 FOO
        "BAR=some_value"  # 预处理器宏定义,定义了宏 BAR,其值为 some_value
      ]
    }
  ]
}

添加头文件路径

{
  "targets": [
    {
      "target_name": "existing_target",  # 目标名称
      "include_dirs": [
        "..",  # 包含的上一级目录
        "include"  # 包含的相对路径为 'include' 的目录
      ]
    }
  ]
}

添加编译器标志

{
  "targets": [
    {
      "target_name": "existing_target",  # 目标名称
      "conditions": [
        [
          "OS==\"win\"",  # 条件:操作系统是 Windows
          {
            "cflags": [
              "/WX"  # Windows 平台下的编译器标志,所有警告视为错误
            ]
          },
          {  # 否则 (OS != "win")
            "cflags": [
              "-Werror"  # 非 Windows 平台下的编译器标志,所有警告视为错误
            ]
          }
        ]
      ]
    }
  ]
}

添加链接器设置

{
  "targets": [
    {
      "target_name": "existing_target",  # 目标名称
      "conditions": [
        [
          "OS==\"linux\"",  # 条件:操作系统是 Linux
          {
            "ldflags": [
              "-pthread"  # Linux 平台下的链接器标志,启用线程支持
            ]
          }
        ]
      ]
    }
  ]
}

添加依赖库

{
  "targets": [
    {
      "target_name": "existing_target",  # 目标名称
      "conditions": [
        [
          "OS==\"linux\"",  # 条件:操作系统是 Linux
          {
            "link_settings": {
              "ldflags": [
                "-pthread"  # Linux 平台下的链接器标志,启用线程支持
              ],
              "libraries": [
                "-L/path/to/lib",  # 指定库文件路径
                "-lmylibrary"  # 链接名为 libmylibrary.so 的库
              ]
            }
          }
        ],
        [
          "OS==\"win\"",  # 条件:操作系统是 Windows
          {
            "link_settings": {
              "libraries": [
                "-L/LIBPATH:C:\\path\\to\\lib",  # 指定库文件路径
                "-lmylibrary.lib"  # 链接名为 mylibrary.lib 的库
              ]
            }
          }
        ]
      ]
    }
  ]
}

拷贝动态库到生成目录

{
  "targets": [
    {
      "target_name": "existing_target",  # 目标名称
      "conditions": [
        [
          "OS==\"linux\"",  # 条件:操作系统是 Linux
          {
            "link_settings": {
              "ldflags": [
                "-pthread"  # Linux 平台下的链接器标志,启用线程支持
              ],
              "libraries": [
                "-L/path/to/lib",  # 指定库文件路径
                "-lmylibrary"  # 链接名为 libmylibrary.so 的库
              ]
            }
          }
        ],
        [
          "OS==\"win\"",  # 条件:操作系统是 Windows
          {
            "copies": [{
                  "destination": "<(PRODUCT_DIR)",
                  "files": [
                    "./dll/*" # 拷贝动态库到生成目录
                  ]
                }],
          }
        ]
      ]
    }
  ]
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值