Свяжите статическую библиотеку с общей библиотекой или с двоичным файлом

У меня есть статическая библиотека из проекта A (назовем ее liba.so), и я хочу скомпилировать общую библиотеку в моем проекте B (назовем ее libb.so) и встроить в нее liba.so.

Кроме того, у меня есть двоичный файл в этом проекте B, который также зависит от liba.so, поэтому я хочу встроить его в двоичный файл.

Это возможно? Как?


person alexandernst    schedule 07.01.2016    source источник
comment
Вы уверены, что проект A создает статическую библиотеку? liba.so - это имя разделяемой библиотеки, которую вы не можете встроить в другую разделяемую библиотеку - liba.a было бы собственным именем для статической библиотеки. Однако см. Также stackoverflow.com/questions/2763988/   -  person nos    schedule 07.01.2016
comment
@nos Действительно, ты прав. Это liba.a. Так что я должен скомпилировать libb.a. В любом случае, я до сих пор не знаю, как заставить Мезона это сделать.   -  person alexandernst    schedule 07.01.2016


Ответы (2)


Когда A - это отдельная база кода

Вам нужно собрать и установить проект A. Затем создать зависимость от проекта A в определении проекта B.

Это выглядит так:

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)
person paxos1977    schedule 09.01.2016

Если у вас есть существующая предварительно скомпилированная библиотека, вы можете напрямую обернуть ее в 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)

(проверено с Meson 0.57)

person ManuelAtWork    schedule 24.02.2021