我有一个项目a使用介子作为构建系统和另一个项目B依赖于a
A运行、编译并通过所有测试。我通过执行meson install
来安装A,它将所有的头文件和共享库对象放在我需要它们的地方。
安装A后,我想编译B,所以我添加了:
A = dependency('A', include_type : 'system')
exe = executable(
'B',
src,
dependencies: [
A
],
cpp_args : '-DSHADER_PATH="' + meson.current_source_dir() + '/"',)
To B的meson.build
,介子发现A是一个包,并开始编译B,但链接失败。A定义了大量的小实用程序,每一个都是自己独立的.so
二进制文件,所有这些都需要链接。查看编译B时执行的命令,使用-L
将A的.so
库所在的目录添加到路径中,但是该目录中没有列出用于链接的库。所以连字符,因为在这些二进制文件中没有找到符号(显然它们没有连接)。
我需要在A中指定什么,让它知道一个给定的库需要在默认情况下被链接,当项目被用作依赖?
例如,下面是A的一个实用程序:
renderer_so_relative_path =
'' + renderer_lib.full_path().replace(meson.build_root() + '/', '')
peripheral_so_relative_path =
'' + peripheral_lib.full_path().replace(meson.build_root() + '/', '')
loader_sources = [
'ModuleStorage.cpp',
'CLI.cpp'
]
install_subdir('.', install_dir : 'include/ModuleStorage/')
loader_lib = library(
'ne_loader',
sources : loader_sources,
cpp_args : [
'-DNE_RENDERER_PATH="' + renderer_so_relative_path + '"',
'-DNE_PERIPHERAL_PATH="' + peripheral_so_relative_path + '"'
],
link_with : [],
include_directories : [],
dependencies : [core_dep, image_dep, argparse_dep, glfw],
install: true)
module_storage_dep = declare_dependency(link_with:loader_lib, include_directories: ['..'])
subdir('Imgui')
也许这有帮助:
添加到您的A项目:
# C compiler
ccompiler = meson.get_compiler('c')
# Where is the lib:
a_lib_dir = '/install/dir'
# Find the lib:
a_lib = ccompiler.find_library('a_lib_name', dirs: a_lib_dir)
# Create dependency
a_lib_dep = declare_dependency(
dependencies: a_lib,
include_directories: include_directories(inc_dir)
)
链接B中的依赖项:
# Dependencies
b_deps = []
b_deps += dependency('alib', fallback:['alib', 'a_lib_dep'])
# Your B object
b_lib = static_library( 'blib', src,
dependencies: b_deps,
etc...)
# Your B object as someone's dependency (if needed):
b_as_dep = declare_dependency(
link_with: b_lib,
include_directories: inc_dirs,
dependencies: b_deps)