Архив ссылок на общую библиотеку с Bazel - PullRequest
1 голос
/ 28 апреля 2020

Используя Bazel, я бы хотел связать независимый от позиции архив stati c напрямую с разделяемой библиотекой (не с приложением, использующим разделяемую библиотеку). Что-то вроде:

g++ -shared mylib.cpp archive.a -o libmylib.so
g++ mybin.cpp -lmylib -o mybin

Обоснование: RedHat упаковывает libelf в виде архива stati c, в котором есть некоторые опубликованные c символы (например, elf_errmsg), помеченные как скрытые: архив должен быть связан к модулю, использующему его (в данном случае, к общей библиотеке): слишком поздно связываться с приложением.

Я пытался:

  • Упаковка архива в правиле cc_import
  • Добавление правила к deps из cc_library: не работает, архив связывается с приложением
  • Добавление правила к srcs из cc_library : не работает, архив связывается с приложением
  • Добавление файла архива непосредственно к linkopts из cc_library: почти работает, но архив связывается как с библиотекой , так и с двоичные файлы в зависимости от него.
  • Переименование архива в .lo или .pic.lo: не работает, архив связывается с приложением с помощью -Wl,wholearchive
  • Добавление alwayslink = True до cc_import: не работает, архив связывается с приложением с -Wl,wholearchive

1 Ответ

1 голос
/ 29 апреля 2020

Примерно так должно работать для того, что вы пытаетесь сделать:

cc_binary(
    name = "libmylib.so",
    srcs = ["mylib.cpp", "archive.a"],
    linkshared = True,
)

cc_library(
    name = "mylib",
    srcs = ["libmylib.so"],
    hdrs = ["mylib.hpp"],
)
cc_binary(
    name = "mybin",
    srcs = ["mybin.cpp"],
    deps = [":mylib"],
)

Вы можете создать общую библиотеку (которая выполняется как cc_binary(linkshared = True); этот бит может показаться не совсем интуитивным) из ваш источник и архив библиотеки.

Вы можете создать cc_library для использования в качестве зависимости от других ваших целей ... и использовать его для построения cc_binary цели.

В Теория, если бы это была только одна вещь времени / места, вы, вероятно, могли бы сократить ее следующим образом (но это скорее пример минимальной длины):

cc_binary(
    name = "libmylib.so",
    srcs = ["mylib.cpp", "archive.a"],
    linkshared = True,
)

cc_binary(
    name = "mybin",
    srcs = ["mybin.cpp", "mylib.hpp", ":libmylib.so"],
)
...