与 Halide 生成器链接的 Pthread 和内省库失败

Pthread and introspection library linking with Halide generators fails

我尝试设置一个三层卷积生成器管道。构建在链接步骤失败。 apps/wavelet

中的示例 构建目录中的

运行 make 导致以下错误:

[ 87%] Linking CXX executable conv-3
CMakeFiles/conv-3.dir/main.cpp.o: In function `Halide::Internal::check_introspection(void const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, int)':
main.cpp:(.text+0xa6): undefined reference to `Halide::Internal::Introspection::get_source_location[abi:cxx11]()'
main.cpp:(.text+0xc3): undefined reference to `Halide::Internal::Introspection::get_variable_name(void const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)'
CMakeFiles/conv-3.dir/main.cpp.o: In function `HalideIntrospectionCanary::(anonymous namespace)::TestCompilationUnit::TestCompilationUnit()':
main.cpp:(.text+0xa6a): undefined reference to `Halide::Internal::Introspection::test_compilation_unit(bool (*)(bool (*)(void const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)), bool (*)(void
 const*, std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&), void (*)())'
./genfiles/halide_rt_host/halide_rt_host.a(halide_rt_host.a.o): In function `halide_spawn_thread':
posix_allocator.cpp:(.text.halide_spawn_thread+0x3d): undefined reference to `pthread_create'
./genfiles/halide_rt_host/halide_rt_host.a(halide_rt_host.a.o): In function `halide_join_thread':
posix_allocator.cpp:(.text.halide_join_thread+0x1a): undefined reference to `pthread_join'
collect2: error: ld returned 1 exit status
CMakeFiles/conv-3.dir/build.make:96: recipe for target 'conv-3' failed
make[2]: *** [conv-3] Error 1
CMakeFiles/Makefile2:230: recipe for target 'CMakeFiles/conv-3.dir/all' failed
make[1]: *** [CMakeFiles/conv-3.dir/all] Error 2
Makefile:83: recipe for target 'all' failed

CMakeLists.txt

project(three_layer_conv)
cmake_minimum_required(VERSION 3.1.3)

set(HALIDE_DISTRIB_DIR "/home/user/workspace/Halide/distrib")
include(/home/user/workspace/Halide/distrib/halide.cmake)

# Define the wavelet app
add_executable(conv-3 "${CMAKE_CURRENT_SOURCE_DIR}/main.cpp")
set_target_properties(conv-3 PROPERTIES CXX_STANDARD 11 CXX_STANDARD_REQUIRED YES CXX_EXTENSIONS NO)
target_include_directories(conv-3 PRIVATE "${HALIDE_INCLUDE_DIR}" "${HALIDE_TOOLS_DIR}")

# Define a halide_library() for each generator we have, and link each one into wavelet
#halide_library("conv_3" SRCS "conv_3_generator.cpp")
#file(GLOB GENS RELATIVE "${CMAKE_CURRENT_SOURCE_DIR}" "${CMAKE_CURRENT_SOURCE_DIR}/*_generator.cpp")
#foreach(GEN_SRC ${GENS})
#    string(REPLACE "_generator.cpp" "" GEN_NAME "${GEN_SRC}")
#    halide_library("${GEN_NAME}" SRCS ${GEN_SRC})
#    target_link_libraries(conv-3 "${GEN_NAME}" )
#endforeach()
#target_link_libraries(conv-3 PUBLIC "conv_3" pthread)

halide_generator(conv_3.generator SRCS conv_3_generator.cpp)
set(LIB conv_3)
halide_library_from_generator(${LIB} GENERATOR conv_3.generator)
target_link_libraries(conv-3 PRIVATE ${LIB} pthread)

make VERBOSE=1 结果

/usr/bin/c++    -rdynamic CMakeFiles/conv-3.dir/main.cpp.o  -o conv-3 ./genfiles/conv_3/conv_3.a -lpthread ./genfiles/halide_rt_host/halide_rt_host.a -ldl

PS: 在命令末尾手动添加 -lpthread 可解决 pthread 链接错误。

我需要更改我的 CMake 文件吗?

编辑:Halide.cmake 可以找到文件 here
halide_library, halide_library_from_generator, halide_generator 函数在 Halide.cmake

中定义

编辑 2
OS : Ubuntu 18.04.3 LTS
编译器:cc/c++ (Ubuntu 7.4.0-1ubuntu1~18.04.1) 7.4.0
链接器:GNU ld(Ubuntu 的 GNU Binutils)2.30
LLVM : LLVM 版本 8.0.0 优化构建
LLVM 选项:none
构建目标:二进制

请添加以下详细信息: - OS - compiler/linker 个正在使用的版本 - 正在使用的 LLVM 版本,以及它是二进制的还是本地构建的 - 正在使用 LLVM 选项

有两种方法解决了这个问题:

  1. 手动将 -lpthread -lHalide 附加到
/usr/bin/c++    -rdynamic CMakeFiles/conv-3.dir/main.cpp.o  -o conv-3 ./genfiles/conv_3/conv_3.a -lpthread ./genfiles/halide_rt_host/halide_rt_host.a -ldl

这解决了链接问题

  1. 将 CXX 编译器设置为 clang++-8