将静态库链接到共享库或二进制文件

时间:2016-01-07 19:02:06

标签: meson-build

我有一个来自项目A的静态库(我们称之为liba.so),我想在我的项目B中编译一个共享库(我们称之为libb.so })并在其中嵌入liba.so

另外,我在该项目B中有一个二进制文件,它也依赖于liba.so,所以我想将它嵌入到二进制文件中。

这可能吗?怎么样?

2 个答案:

答案 0 :(得分:3)

当A是单独的代码库时

您所做的是构建和安装项目A.然后在项目B的定义中创建项目A的依赖项。

看起来像这样:

a_dep = dependency('a', version : '>=1.2.8')    
lib_b = shared_library('proj_b', sources: 'prog_b.c', dependencies : a_dep)

dependency中的版本部分是可选的。

当A与B相同的Meson项目

当A和B在同一个介子项目中时,它有点丑陋。您必须在A中声明一个依赖关系锚点。

看起来像这样:

incdirs = include_directories('include')
lib_a = static_library('a', 'proj_a.c', include_directories : indirs)

liba_dependency = declare_dependency(
   include_directories : incdirs,
   link_with : lib_a,
   sources : ['proj_a.c'])

然后项目B变为:

lib_b = shared_library('proj_b', sources: 'prog_b.c', dependencies : lib_a)

答案 1 :(得分:0)

如果您有一个现有的预编译库,那么您可以直接将其包装在 dependency 中:

cpp = meson.get_compiler('cpp')

# (Meson requires an absolute path for find_library().)
libdir = meson.current_source_dir() + './lib/

precompiledA_dep = cpp.find_library('A', dirs : libdir) # ./lib/libA.lib

...
# Link against libA.lib here ...
B_lib = library('libB', 'libB.cpp', dependencies : precompiledA_dep)
B_exe = executable('exeB', 'source.cpp', dependencies : precompiledA_dep)

(使用介子 0.57 测试)