2017-07-21 4 views
1

Je compile mon programme en utilisant Bazel, et j'ai une dépendance sur Intel TBB. Intel TBB fournit uniquement des bibliothèques dynamiques (pas de statique) pour de bonnes raisons (si vous êtes curieux: ctrl+f static here).Liaison d'une lib dynamique en utilisant Bazel sur MacOS

Dans mon WORKSPACE Bazel je définis cette règle:

new_local_repository(
    name = "inteltbb", 
    path = "./third_party/intel_tbb", 
    build_file = "./third_party/inteltbb.BUILD", 
) 

et dans mon "inteltbb.BUILD" J'ai:

cc_library(
    name = "dynamic_lib", 
    srcs = ["build/macos_intel64_clang_cc8.1.0_os10.12.5_debug/libtbb_debug.dylib"], 
    hdrs = glob(["include/**/*.h"]), 
    visibility = ["//visibility:public"], 
    strip_include_prefix = "include/" 
) 

Puis dans mon programme final (sous la règle de cc_binary) I have:

deps = [ 
    "@inteltbb//:dynamic_lib", [...] 

Il compile correctement, trouve les en-têtes avec succès mais à l'exécution il plante en disant:

____Running command line: bazel-bin/build-game 
dyld: Library not loaded: @rpath/libtbb_debug.dylib 
    Referenced from: /private/var/tmp/_bazel_dmabin/526b91f44cfc47d856222c6b20765cc8/execroot/__main__/bazel-out/darwin_x86_64-fastbuild/bin/build-game 
    Reason: image not found 

-je vérifier sous la "Bazel-bin" dossier (où l'exécutable est symlink pour l'exécution d'exécution: Bazel-bin/build-game.runfiles/principale /) et je n'ai:

  • le lien symbolique pour l'exécutable (build-jeu)
  • un dossier appelé (accrochez-vous): _solib_darwin_x86_64/[email protected]_S_S_Cdynamic_Ulib___Uexternal_Sinteltbb_Sbuild_Smacos_Uintel64_U clang_Ucc8.1.0_Uos10.12.5_Udebug contenant mon libtbb_debug.dylib pour TBB intel.

Aussi quand je lance: otool -l build-game | grep LC_RPATH -A2 le résultat est:

 cmd LC_RPATH 
    cmdsize 152 
    path $ORIGIN/_solib_darwin_x86_64/[email protected]_S_S_Cdynamic_Ulib___Uexternal_Sinteltbb_Sbuild_Smacos_Uintel64_Uclang_Ucc8.1.0_Uos10.12.5_Udebug (offset 12) 

Je ne comprends pas pourquoi mon exécutable ne trouve pas mon dylib. Je ne trouve rien de mal à propos de la sortie otool mais je ne suis pas un expert mac (du tout). Toute idée est la bienvenue.

[modifier] Si je modifier le fichier exécutable en utilisant otool pour remplacer le chemin du dylib comme ça:

@executable_path/_solib_darwin_x86_64/[email protected]_S_S_Cdynamic_Ulib___Uexternal_Sinteltbb_Slib/libtbb_debug.dylib 

Ensuite, il fonctionne très bien. Je ne me sens pas bien que bazel me force à le faire à chaque compilation:/

[edit 2] Quelques personnes m'ont demandé la ligne que j'ai utilisée pour modifier le chemin de la lib dans l'exécutable. Première course:

otool -L build-game 

à repérer le chemin du lib que vous voulez changer. Dans mon cas c'était: @ rpath/libtbb_debug.dylib. Après cette course:

install_name_tool -change @rpath/libtbb_debug.dylib @executable_path/_solib_darwin_x86_64/[email protected]_S_S_Cdynamic_Ulib___Uexternal_Sinteltbb_Slib/libtbb_debug.dylib build-game 

pour changer le chemin. Notez que vous pouvez utiliser @executable_path pour le rendre relatif au chemin binaire ou vous pouvez mettre un chemin absolu, à vous.

Répondre

1

Je pense que c'est déjà un known issue, et il a été juste corrigé. Désolé pour le dérangement. [Edit: mis à jour après avoir soumis le correctif]

+0

Thx pour l'info.En attendant, sur Mac, j'ai une marque moche qui fera l'affaire jusqu'à ce que le problème soit résolu dans Bazel ... – Sistr

+0

Le problème vient de se corriger, j'ai mis à jour la réponse. – mhlopko

+0

Je vais l'essayer maintenant, et marquer votre réponse juste après :) – Sistr