Как исправить "ld: symbol (s), не найденные для архитектуры x86_64", используя C ++, CMake и Tensorflow? - PullRequest
2 голосов
/ 25 октября 2019

Я создал тестовый проект на C ++, используя TensorFlow с CMake. Но у меня есть ошибка:

ld: symbol(s) not found for architecture x86_64

Я думаю, у меня есть ошибка в моих файлах CMake. Когда я пытаюсь скомпилировать через терминал с gcc tensortest.cpp -ltensorflow -o tf, все работает нормально.

У меня есть два файла CMake.

FindTensorFlow.cmake:

# Locates the tensorFlow library and include directories.
include(FindPackageHandleStandardArgs)
unset(TENSORFLOW_FOUND)

find_path(TensorFlow_INCLUDE_DIR
        NAMES
        tensorflow
        HINTS

        /usr/local/include/tensorflow)

find_library(TensorFlow_LIBRARY
        NAMES
        libtensorflow_framework.1.14.0.dylib
        libtensorflow_framework.1.dylib
        libtensorflow_framework.dylib
        libtensorflow.1.14.0.dylib
        libtensorflow.1.dylib
        libtensorflow.dylib
        HINTS
        /usr/local/lib)

# set TensorFlow_FOUND
find_package_handle_standard_args(TensorFlow DEFAULT_MSG TensorFlow_INCLUDE_DIR TensorFlow_LIBRARY)

# set external variables for usage in CMakeLists.txt
if(TENSORFLOW_FOUND)
  set(TensorFlow_LIBRARIES ${TensorFlow_LIBRARY})
  set(TensorFlow_INCLUDE_DIRS ${TensorFlow_INCLUDE_DIR})
endif()

# hide locals from GUI
mark_as_advanced(TensorFlow_INCLUDE_DIR TensorFlow_LIBRARY)

CMakeLists.txt

cmake_minimum_required(VERSION 3.15)
project(TensorFlowTest)

set(CMAKE_CXX_STANDARD 14)
list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake/")

find_package(TensorFlow REQUIRED)
include_directories(${TensorFlow_INCLUDE_DIRS} ${TensorFlow_LIBRARIES})

add_executable(TensorFlowTest main.cpp)
target_link_libraries(TensorFlowTest ${TensorFlow_INCLUDE_DIRS} ${TensorFlow_LIBRARIES})

И один main.cpp

#include <stdio.h>
#include <tensorflow/c/c_api.h>

int main() {
    printf("Hello from TensorFlow C library version %s\n", TF_Version());
    return 0;
}

При перезагрузке проекта у меня появляется сообщение CMake:

-- Found TensorFlow: /usr/local/include  
-- Configuring done
WARNING: Target "TensorFlowTest" requests linking to directory "/usr/local/include".  Targets may link only to libraries.  CMake is dropping the item.
-- Generating done
-- Build files have been written to: /Users/neikr/CLionProjects/TensorFlowTest/cmake-build-debug

А при компиляции:

Scanning dependencies of target TensorFlowTest
[ 50%] Building CXX object CMakeFiles/TensorFlowTest.dir/main.cpp.o
[100%] Linking CXX executable TensorFlowTest
Undefined symbols for architecture x86_64:
  "_TF_Version", referenced from:
      _main in main.cpp.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[3]: *** [TensorFlowTest] Error 1
make[2]: *** [CMakeFiles/TensorFlowTest.dir/all] Error 2
make[1]: *** [CMakeFiles/TensorFlowTest.dir/rule] Error 2
make: *** [TensorFlowTest] Error 2

Обновление

Я попытался make с VERBOSE=1, и я получил этот вывод:

/Applications/CLion.app/Contents/bin/cmake/mac/bin/cmake -S/Users/neikr/CLionProjects/TensorFlowTest -B/Users/neikr/CLionProjects/TensorFlowTest --check-build-system CMakeFiles/Makefile.cmake 0
/Applications/CLion.app/Contents/bin/cmake/mac/bin/cmake -E cmake_progress_start /Users/neikr/CLionProjects/TensorFlowTest/CMakeFiles /Users/neikr/CLionProjects/TensorFlowTest/CMakeFiles/progress.marks
/Applications/Xcode.app/Contents/Developer/usr/bin/make -f CMakeFiles/Makefile2 all
/Applications/Xcode.app/Contents/Developer/usr/bin/make -f CMakeFiles/TensorFlowTest.dir/build.make CMakeFiles/TensorFlowTest.dir/depend
cd /Users/neikr/CLionProjects/TensorFlowTest && /Applications/CLion.app/Contents/bin/cmake/mac/bin/cmake -E cmake_depends "Unix Makefiles" /Users/neikr/CLionProjects/TensorFlowTest /Users/neikr/CLionProjects/TensorFlowTest /Users/neikr/CLionProjects/TensorFlowTest /Users/neikr/CLionProjects/TensorFlowTest /Users/neikr/CLionProjects/TensorFlowTest/CMakeFiles/TensorFlowTest.dir/DependInfo.cmake --color=
/Applications/Xcode.app/Contents/Developer/usr/bin/make -f CMakeFiles/TensorFlowTest.dir/build.make CMakeFiles/TensorFlowTest.dir/build
[ 50%] Linking CXX executable TensorFlowTest
/Applications/CLion.app/Contents/bin/cmake/mac/bin/cmake -E cmake_link_script CMakeFiles/TensorFlowTest.dir/link.txt --verbose=1
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/c++  -g -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk -Wl,-search_paths_first -Wl,-headerpad_max_install_names  CMakeFiles/TensorFlowTest.dir/main.cpp.o  -o TensorFlowTest -Wl,-rpath,/usr/local/lib /usr/local/lib/libtensorflow_framework.1.14.0.dylib 
Undefined symbols for architecture x86_64:
  "_TF_Version", referenced from:
      _main in main.cpp.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
make[2]: *** [TensorFlowTest] Error 1
make[1]: *** [CMakeFiles/TensorFlowTest.dir/all] Error 2
make: *** [all] Error 2

Также я попытался добавить message("TensorFlow_LIBRARIES: ${TensorFlow_LIBRARIES}") в конец моего CMakeи я получаю это сообщение:

TensorFlow_LIBRARIES: /usr/local/lib/libtensorflow_framework.1.14.0.dylib

1 Ответ

0 голосов
/ 26 октября 2019

На основании вашей распечатки из команды message() становится более ясным, что происходит. В вашем файле FindTensorFlow.cmake вызов find_library() находит только одну библиотеку (libtensorflow_framework.1.14.0.dylib), что соответствует ожидаемому поведению:

Один разиз вызовов успешно, переменная результата будет установлена ​​и сохранена в кэше, так что ни один вызов не будет искать снова.

Если для опции NAMES задано более одного значения, эта команда по умолчанию будет рассматривать одно имяи ищите его в каждом каталоге.

Таким образом, как только find_library() находит библиотеку libtensorflow_framework, поиск прекращается . Если вы также хотите найти libtensorflow.dylib, что может помочь с ошибкой вашей ссылки, вы должны указать другой вызов find_library(), используя другую переменную TensorFlow_. Поэтому изменение этого раздела вашего FindTensorFlow.cmake на что-то вроде этого должно помочь:

find_library(TensorFlow_LIBRARY
        NAMES
        libtensorflow.1.14.0.dylib
        libtensorflow.1.dylib
        libtensorflow.dylib
        HINTS
        /usr/local/lib)

find_library(TensorFlow_FRAMEWORK_LIBRARY
        NAMES
        libtensorflow_framework.1.14.0.dylib
        libtensorflow_framework.1.dylib
        libtensorflow_framework.dylib
        HINTS
        /usr/local/lib)

# set TensorFlow_FOUND
find_package_handle_standard_args(TensorFlow DEFAULT_MSG 
    TensorFlow_INCLUDE_DIR 
    TensorFlow_LIBRARY 
    TensorFlow_FRAMEWORK_LIBRARY
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...