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 monlibtbb_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.
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
Le problème vient de se corriger, j'ai mis à jour la réponse. – mhlopko
Je vais l'essayer maintenant, et marquer votre réponse juste après :) – Sistr