Я впервые задаю вопрос в stackoverflow. Я сделаю все возможное, чтобы правильно сформулировать свой вопрос.
Я хочу использовать пользовательскую функцию tenorflow в библиотеке c ++, которая уже использует тензор потока в качестве третьей стороны. Но я просто не знаю, как использовать мою пользовательскую операцию в коде c ++. Я пытаюсь узнать это с помощью простого примера ZeroOut из учебника Tensroflow c ++. Я зарегистрировал опцию ZeroOut для процессора как https://github.com/MatteoRagni/tf.ZeroOut.gpu:, компилируя с make работал, и я получил .so файл в папке usr-ops, где также был файл cc. Затем я попытался добавить файл ZeroOut.so в мою библиотеку как разделяемую библиотеку, но он не скомпилировался. Однако до того, как я добавил свою пользовательскую операцию, зарегистрировался в bazel, как описано в новом руководстве по tenorflow, таким же образом и моя библиотека скомпилирована. Возможно, потому что .so файл был создан в ../bazel-bin/tensorflow/core/user_ops/. Но в этом случае я не могу использовать операцию, как я должен. И включение ZeroOut.cpp или файлов .cpp моей операции в мои файлы c ++ до сих пор не имело никакого значения.
Вот мой CMakeList.txt, который также создает всю библиотеку, с которой я работаю:
cmake_minimum_required(VERSION 2.8)
project(Project1)
set(CMAKE_BUILD_TYPE "Release") # Debug Release
set(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAGS} -std=c++14 -O3 -Wall -fopenmp")
SET(CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)
#-------------path of 3rd party libraries-------------
# special libs.
find_package(Boost COMPONENTS filesystem iostreams regex)
find_package(FFTW)
find_package(NLopt)
find_package(HDF5 COMPONENTS CXX)
set(EXTERN_LIB_ROOT ${PROJECT_SOURCE_DIR}/3rd-party)
set(TENSORFLOW_ROOT /.../tensorflow)
set(TF_INCLUDE_DIRS "${TENSORFLOW_ROOT}" "${TENSORFLOW_ROOT}/bazel- genfiles" "${TENSORFLOW_ROOT}/bazel-tensorflow/external/protobuf_archive/src")
# lib dirs.
set(LUA_LIBRARIES "${EXTERN_LIB_ROOT}/lua/liblua53.so") #5.3.4
set(LINENOISE_LIBRARIES "${EXTERN_LIB_ROOT}/linenoise-ng/build/liblinenoise.so")
set(YACAS_LIBRARIES "${EXTERN_LIB_ROOT}/yacas/cyacas/libyacas/build/libyacas.so")
set(TF_LIBRARIES ${TENSORFLOW_ROOT}/bazel-bin/tensorflow/libtensorflow_cc.so
${TENSORFLOW_ROOT}/tensorflow/core/user_ops/tf.ZeroOut.gpu-master/zero_out.so
${TENSORFLOW_ROOT}/bazel-bin/tensorflow/core/user_ops/MyNewOp.so)
#-------------ssl headers-------------
include_directories(${PROJECT_SOURCE_DIR}/src
${EXTERN_LIB_ROOT}/eigen
${EXTERN_LIB_ROOT}/gnuplot-iostream
${EXTERN_LIB_ROOT}/
${EXTERN_LIB_ROOT}/linenoise-ng/include
${EXTERN_LIB_ROOT}/yacas/cyacas/libyacas/include
${EXTERN_LIB_ROOT}/lua/src
${NLOPT_INCLUDE_DIRS}
${FFTW_INCLUDES}
${TF_INCLUDE_DIRS}
${Boost_INCLUDE_DIRS}
${HDF5_INCLUDE_DIRS}
${TENSORFLOW_ROOT})
option(BUILD_SHARED_LIBS "build shared library" ON)
set(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/lib)
#-------------ssl kernel lib-------------
file(GLOB_RECURSE _src_list
LIST_DIRECTORIES false
RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}" "${PROJECT_SOURCE_DIR}/src/*.h" "${PROJECT_SOURCE_DIR}/src/*.cpp" "")
add_library(ssl SHARED ${_src_list})
set(SSL_LIBRARIES ${TF_LIBRARIES} ${LUA_LIBRARIES} ${Boost_LIBRARIES} ${NLOPT_LIBRARIES} ${FFTW_LIBRARIES} ${LINENOISE_LIBRARIES} ${YACAS_LIBRARIES} ${HDF5_CXX_LIBRARIES}) #${TF_LIBRARIES}
target_link_libraries(ssl ${SSL_LIBRARIES} dl)
add_executable(Project1 main.cpp)
target_link_libraries(Project1 ssl)
Есть связанный вопрос, но нет четкого ответа. Как запустить собственный тензор потока GPU :: op из кода C ++?
Что я делаю не так? У меня нет опыта работы с общей библиотекой, но, может быть, есть и другие лучшие способы сделать то, что я пытаюсь сделать ...?
Может кто-нибудь помочь мне, может быть, привести пример необходимого CMakeList.txt?
Об ошибках, которые я получил во время выполнения:
это было очень тривиально, просто функция в моем файле .so не могла быть найдена, если вызывалась с правильным количеством параметров, если вызывалась с неправильным, она просто не выполнялась.
Тем временем я нашел лучший обходной путь. Поскольку я могу использовать свою собственную операционную систему в python, я буду встраивать python в мою библиотеку c ++, вызывать функцию python для создания графа, который будет вызывать мою собственную операционную систему для построения графа. Но я еще не закончил.