2017-04-05 3 views
0

여러분,Bazel Link .so 라이브러리는 전혀 다른 원격 폴더에 있습니다.

.th 라이브러리와 정적 라이브러리를 내 tensorflow 프로그램에 연결하려고합니다. 내 헤더는

/usr/local/lib 

/usr/local/include/lcm 

그리고 정적/공유 라이브러리 (.so를, 등)에 있지만 Bazel은 존재하지 않는 불평하거나 그들을 찾을 수 없습니다. 여기 내 빌드 파일 내 코드입니다 : 내가 (BUILD 및 main.cc 모두에서) LCM 관련 코드를 제거하면

package(default_visibility = ["//tensorflow:internal"]) 
licenses(["notice"]) # Apache 2.0 
exports_files(["LICENSE"]) 

# LCM shared libraries path 
cc_library(
    name = "lcm_lib", 
    srcs = glob([ 
     "*.so", 
    ]), 
    copts = ["-L/usr/local/lib"], 
    linkopts = ["-pthread", "-shared"], 
    visibility = ["//visibility:public"], 
) 

# LCM header libraries path 
cc_library(
    name = "lcm_headers", 
    hdrs = glob([ 
     "include/**/*.h", 
    ]), 
    copts = ["-L/usr/local/include"], 
    linkopts = ["-pthread"], 
    visibility = ["//visibility:public"], 
) 

cc_binary(
    name = "myProject", 
    srcs = [ 
     "main.cc", 
    ], 
    linkopts = ["-lm"], 
    deps = [ 
     "//tensorflow/cc:cc_ops", 
     "//tensorflow/core:framework_internal", 
     "//tensorflow/core:tensorflow", 
    ], 
) 

filegroup(
    name = "all_files", 
    srcs = glob(
     ["**/*"], 
     exclude = [ 
      "**/METADATA", 
      "**/OWNERS", 
      "bin/**", 
      "gen/**", 
     ], 
    ), 
    visibility = ["//tensorflow:__subpackages__"], 
) 

, 그럼 내 프로그램 빌드 및 실행됩니다. LCM을 포함 시키면 lcm :: LCM :: ~ LCM()이 정의되지 않았으며 liblcm.so를 찾을 수 없다는 오류가 발생합니다. 이제는 비 tensorflow 코드 (또는 대부분의 프로젝트)에서 cmake를 실행 중이며 LCM과 필요한 나머지 라이브러리 (openCV 등)를 찾을 수 있습니다. CMakeList.txt와 같은 명령을 다음과 같이 사용합니다.

# search path for LCM header files 
set(LCM_IncludeSearchPaths 
    /usr/include/ 
    /usr/local/include/ 
    /opt/local/include 
) 
# search path for LCM static/dynamic libraries 
set(LCM_LibrarySearchPaths 
    /usr/lib/ 
    /usr/local/lib/ 
    /opt/local/lib/ 
) 
find_path(LCM_INCLUDE_DIR 
    NAMES lcm/lcm.h 
    HINTS ${LCM_IncludeSearchPaths} 
) 
FIND_LIBRARY(LCM_LIBS 
    NAMES lcm 
    HINTS ${LCM_LibrarySearchPaths} 
    PATH_SUFFIXES lib 
) 

그리고 모두 작동합니다. 그러나이 기밀성을 보장하기 위해, :-(

답변

1

Bazel은 샌드 박스 (귀하의 경우에는 C++ 컴파일 행동) 액션을 실행하는 긴 질문에 대한

죄송합니다 tensorflow 및 Bazel 작동하지 않습니다. 이것은 할 필요 행동 변화의 입력이. 따라서이 시스템 포함 해 약 모든 입력 Bazel에게해야 할 때.

를 해결하지만, 물론 당신은 시스템 라이브러리에 의존 local_repository rule 좀 걸릴 수 있습니다. 당신은 또한 찾을 수 있습니다 이 example in [email protected] 스레드가 유용합니다.

+0

내가 오류를 얻을 : @ lcm_headers // ':' 'lcm_headers'라는 저장소에 저장할 수 없습니다. ''lcm_headers // ': 패키지'external '을 (를)로드하는 중 오류가 발생했습니다. 오류 :/home/mario/tensorflow_HY/tensorflow/examples/MYPROJECT/cpp/BUILD : 39 : '// tensorflow/examples/MYPROJECT/cpp : PROJECT'에 의해 해결되고 참조되어야합니다. – Pototo

+0

위의 WOKSPACE 및 새로운 BUILD 파일을 참조하십시오. 미리 도움을 주셔서 감사합니다 – Pototo

+0

repo의 루트에 붙여 넣은 작업 영역 파일입니까? 어쩌면 루트에 하나, tensorflow/examples/MYPROJECT /에 두 개의 작업 영역 파일이있을 수 있습니다. 루트를 편집하십시오. 그것보다 괜찮아 보이는 .. – mhlopko

1

여기 @mhlopko 같은 디렉토리에있는 내 빌드 및 WORKSPACE 파일은 다음과 같습니다

이 내 감동 작업 영역 파일 :

# LCM static libraries 
new_local_repository(
    name = "lcm_libs", 
    # pkg-config --variable=libdir x11 
    path = "/usr/local/lib", 
    build_file_content = """ 
cc_library(
    name = "liblcm", 
    srcs = ["liblcm.so"], 
    visibility = ["//visibility:public"], 
) 
""", 
) 

# LCM header files 
new_local_repository(
    name = "lcm_headers", 
    # pkg-config --variable=libdir x11 
    path = "/usr/local/include", 
    build_file_content = """ 
cc_library(
    name = "lcm", 
    hdrs = glob([ 
     "lcm/*.h", "lcm/*.hpp", 
    ]), 
    visibility = ["//visibility:public"], 
) 
""", 
) 

# bind to a name to avoid using the "actual" format 
#bind(
# name = "liblcm", 
# actual = "@lcm_libs//:liblcm", 
#) 
#bind(
# name = "lcm", 
# actual = "@lcm_headers//:lcm", 
#) 
# 

그리고 내 BUILD :

# Description: 
# Tensorflow C++ inference example for labeling images. 

package(default_visibility = ["//tensorflow:internal"]) 
licenses(["notice"]) # Apache 2.0 
exports_files(["LICENSE"]) 

cc_binary(
    name = "facialFatigue", 
    srcs = [ 
     "main.cc", 
    ], 
    linkopts = ["-lm"], 
    deps = [ 
     "//tensorflow/cc:cc_ops", 
     "//tensorflow/core:framework_internal", 
     "//tensorflow/core:tensorflow", 
     "@lcm_libs//:liblcm", 
     "@lcm_headers//:lcm", 
    ], 
) 

filegroup(
    name = "all_files", 
    srcs = glob(
     ["**/*"], 
     exclude = [ 
      "**/METADATA", 
      "**/OWNERS", 
      "bin/**", 
      "gen/**", 
     ], 
    ), 
    visibility = ["//tensorflow:__subpackages__"], 
)