构建目标

Meson 提供四种构建目标:可执行文件、库(可以设置为静态构建或共享构建,或者在构建配置时同时构建两者)、静态库和共享库。它们分别使用命令 executablelibrarystatic_libraryshared_library 创建。通过这种方式创建的所有对象都是不可变的。也就是说,在构建目标构造完成后,您无法更改其任何方面。这确保了与给定构建目标相关的所有信息都指定在一个定义明确的位置。

库和可执行文件

例如,以下是如何构建库。

project('shared lib', 'c')
library('mylib', 'source.c')

通常建议使用 library 命令而不是 shared_librarystatic_library,然后使用 default_library 内置选项 在构建配置时配置将要构建的库(静态或共享或两者)。

在类 Unix 操作系统中,共享库可以进行版本控制。Meson 通过关键字参数支持这一点,如果库在编译时配置为静态,则会忽略这些关键字参数。

project('shared lib', 'c')
library('mylib', 'source.c', version : '1.2.3', soversion : '1')

通常的做法是先构建一个库,然后再构建一个链接到该库的可执行文件。这也得到支持。

project('shared lib', 'c')
lib = library('mylib', 'source.c')
executable('program', 'prog.c', link_with : lib)

Meson 会进行设置,以便生成的执行文件可以直接从构建目录运行。无需编写 shell 脚本或设置环境变量。

一个目标可以有多个语言源文件。

project('multilang', 'c', 'cpp')
executable('multiexe', 'file.c', 'file2.cc')

目标文件

有时您无法从源代码构建文件,但需要使用现有的目标文件。一个典型的情况是使用第三方提供的目标文件。目标文件可以像源代码一样指定。

exe = executable('myexe', 'source.cpp', objects : 'third_party_object.o')

另一种情况是当您想要将一个目标中构建的目标文件直接用在另一个目标中。一个典型的情况是当您构建一个共享库,并且它有一个在 ABI 中未导出的内部类。这意味着即使您链接到库,您也无法访问它。针对这种情况的典型解决方法包括构建该库的共享版本和静态版本,或者将源文件放在测试可执行文件的源列表中。这两种方法都会导致源代码被构建两次,这很慢。

在 Meson 中,您可以从目标中提取目标文件,并将其原样使用在其他目标中。以下是它的语法。

lib = shared_library('somelib', 'internalclass.cc', 'file.cc', ...)
eo = lib.extract_objects('internalclass.cc')
executable('classtest', 'classtest.cpp', objects : eo)

在这里,我们获取内部类的目标文件,并将其直接用于测试。源文件只编译一次。

请注意,不小心使用此功能可能会导致奇怪的错误。例如,尝试将可执行文件或静态库的目标文件用于共享库将无法工作,因为共享库目标文件需要特殊的编译器标志。确保正确使用是用户的责任。因此,强烈建议您只将此功能用于按上述方式生成单元测试可执行文件。

搜索结果是