Распространяются ли флаги компоновщика (linkopts) в Базеле?

Я создаю библиотеку Android на основе Tensorflow с помощью Bazel.

Здесь файл BUILD

cc_binary(
    name = "libfoo.so",
    srcs = glob([
         "jni/**/*.cc",
         "jni/**/*.h",
    ]),
    copts = [ "-fexceptions", "-DEIGEN_AVOID_STL_ARRAY",
              "-mfpu=neon", "-std=c++11",
              "-DMIN_LOG_LEVEL=0", "-DTF_LEAN_BINARY",
              "-O2", ],
    linkopts = [
        "-llog",
        "-lm",
    ],
    linkshared = 1,
    deps = [
        "@org_tensorflow//tensorflow/core:android_tensorflow_lib",
        "@boringssl//:crypto",
    ],
)

Компоновщик жалуется, что не находит -lpthread, а я не добавил этот флаг в linkopts.

Я проверил выполненную команду, и на самом деле на ней есть лишние флаги: -lz -lpthread ...

Откуда они взялись? Есть ли обходной путь для этого?


person Ghilas BELHADJ    schedule 06.02.2017    source источник
comment
Конфигурация компилятора C++ также может указывать параметры компоновщика, и, вероятно, именно это здесь и происходит. Используете ли вы встроенные правила NDK для компиляции под Android? Можете ли вы показать команду Bazel, которую вы используете?   -  person Ulf Adams    schedule 18.02.2017
comment
@UlfAdams Я уже получил ответ от ваших коллег. Смотрите ответ ниже. Вы можете найти команду в выпуске github.   -  person Ghilas BELHADJ    schedule 01.03.2017


Ответы (1)


Я получил ответ от системы отслеживания проблем tensorflow.

@jart

Поскольку копты и линкопты являются вирусными и распространяются на зависимости, -lpthread, скорее всего, наследуется от @boringssl//:crypto

@andrewharp

-lpthread не требуется или невозможен на Android, поэтому кажется, что решением будет добавить еще одно условие для оператора select, как в связанном коммите google/protobuf#1386:

...

Единственный известный мне обходной путь, который не требует редактирования другого репозитория, — это создание фиктивной цели libpthread.so, но это довольно хакерский подход.

person Ghilas BELHADJ    schedule 18.02.2017
comment
В энциклопедии сборки говорится, что флаги действуют только для компиляции этой цели, а не ее зависимостей, поэтому я не думаю, что первое утверждение правильно... или документы неверны: docs.bazel.build/versions/master/be/c-cpp.html#cc_library.copts - person cheshirekow; 10.01.2019