如何使用C ++,CMake和Tensorflow修复“对于体系结构x86_64找不到ld:符号”?

时间:2019-10-25 15:54:06

标签: c++ macos tensorflow cmake

我使用TensorFlow和CMake在C ++中创建了一个测试项目。但是我有一个错误:

file(GLOB MY_EXCLUDED_SOURCES aaa/bb/*.cxx)
set_property(SOURCE ${MY_EXCLUDED_SOURCES} PROPERTY SKIP_AUTOMOC ON)

我认为,我的CMake文件中有一个错误。当我尝试使用ld: symbol(s) not found for architecture x86_64 通过终端进行编译时,一切正常。

我有两个CMake文件。

FindTensorFlow.cmake:

gcc tensortest.cpp -ltensorflow -o tf

CMakeLists.txt

# 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)

还有一个main.cpp

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})

重新加载项目时,我收到CMake消息:

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

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

并且在编译时:

-- 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 添加到CMake的末尾,并得到以下消息:

message("TensorFlow_LIBRARIES: ${TensorFlow_LIBRARIES}")

1 个答案:

答案 0 :(得分:1)

根据message()命令的打印输出,更清楚了正在发生什么。在您的FindTensorFlow.cmake文件中,find_library()调用仅找到一个 one 库(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
)