【问题标题】:Link static library to shared library or to a binary将静态库链接到共享库或二进制文件
【发布时间】:2016-01-07 19:02:06
【问题描述】:

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

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

这可能吗?怎么样?

【问题讨论】:

  • 您确定项目 A 创建了静态库吗? liba.so 是共享库的名称,您不能将其嵌入到另一个共享库中 - liba.a 将是静态库的正确名称。但是,另请参阅stackoverflow.com/questions/2763988/…
  • @nos 确实,你是对的。这是liba.a。所以我应该编译libb.a。无论如何,我仍然不确定如何让介子做到这一点。
  • 请酌情使用liba.a 更新问题。这很令人困惑

标签: meson-build


【解决方案1】:

当 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 在同一个介子项目中时

当 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)

【讨论】:

    【解决方案2】:

    如果您有一个现有的、预编译的库,那么您可以直接将其包装在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 测试)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多