编译 D 应用程序

Meson 支持编译 D 程序。一个最小的 meson.build 文件如下所示

project('myapp', 'd')

executable('myapp', 'app.d')

条件编译

如果您正在使用 version() 功能进行条件编译,您可以使用 d_module_versions 目标属性来使用它

project('myapp', 'd')
executable('myapp', 'app.d', d_module_versions: ['Demo', 'FeatureA'])

为了调试,debug() 条件在调试版本中自动编译,并且可以使用 d_debug 参数添加额外的标识符

project('myapp', 'd')
executable('myapp', 'app.d', d_debug: [3, 'DebugFeatureA'])

declare_dependency

自 0.62.0 起,在使用 declare_dependency 声明您自己的依赖项时,可以添加 D 特定功能的参数,例如传播条件编译版本

my_dep = declare_dependency(
    # ...
    d_module_versions: ['LUA_53'],
    d_import_dirs: include_directories('my_lua_folder'),
)

接受的 D 特定参数是 d_module_versionsd_import_dirs(DMD -J 开关)。

使用嵌入式单元测试

如果您使用嵌入式 单元测试函数,您的源代码需要编译两次,一次在常规模式下,一次在单元测试激活的情况下。这是通过将 d_unittest 目标属性设置为 true 来完成的。Meson 将始终只传递相应的编译器的 -unittest 标志,并且永远不会让编译器生成空的 main 函数。如果您需要以可移植的方式使用该功能,请自己为单元测试创建一个空的 main() 函数,因为 GNU D 编译器没有此功能。

这是一个使用 D 单元测试和 Meson 的示例

project('myapp_tested', 'd')

myapp_src = ['app.d', 'alpha.d', 'beta.d']
executable('myapp', myapp_src)

test_exe = executable('myapp_test', myapp_src, d_unittest: true)
test('myapptest', test_exe)

编译 D 库并安装它们

构建 D 库是一个简单的过程,与在 Meson 中构建 C 库的方式没有区别。您应该生成一个 pkg-config 文件并安装它,以便系统上的其他软件在安装后找到依赖项。

这是一个关于如何构建 D 共享库的示例

project('mylib', 'd', version: '1.2.0')

project_soversion = 0
glib_dep = dependency('glib-2.0')

my_lib = library('mylib',
    ['src/mylib/libfunctions.d'],
    dependencies: [glib_dep],
    install: true,
    version: meson.project_version(),
    soversion: project_soversion,
    d_module_versions: ['FeatureA', 'featureB', 1]
)

pkgc = import('pkgconfig')
pkgc.generate(name: 'mylib',
              libraries: my_lib,
              subdirs: 'd/mylib',
              version: meson.project_version(),
              description: 'A simple example D library.',
              d_module_versions: ['FeatureA', 1]
)
install_subdir('src/mylib/', install_dir: 'include/d/mylib/')

重要的是让 D 源代码安装在包含路径中的子目录中,在本例中为 /usr/include/d/mylib/mylib。所有 D 编译器默认情况下都包含 /usr/include/d 目录,如果您的库将安装到 /usr/include/d/mylib 中,那么您在安装它的机器上再次编译项目时,编译器很有可能会优先使用旧的安装包含文件而不是源代码树中的新版本,从而导致非常令人困惑的错误。

这是一个关于如何在应用程序中使用我们刚刚构建和安装的 D 库的示例

project('myapp', 'd')

mylib_dep = dependency('mylib', version: '>= 1.2.0')
myapp_src = ['app.d', 'alpha.d', 'beta.d']
executable('myapp', myapp_src, dependencies: [mylib_dep])

请记住,库和可执行文件都需要使用完全相同的 D 编译器和 D 编译器版本构建。D ABI 在编译器及其版本之间并不稳定,混合编译器会导致问题。

与 DUB 集成

DUB 是 D 的一个完全集成的构建系统,但它也是提供依赖项的一种方式。从 D 包注册表 添加依赖项非常简单。您可以在 依赖项 中找到如何执行此操作。您还可以自动生成 dub.json 文件,如 Dlang 中所述。

搜索结果为