将 cuda 对象文件 .cu.o 与 CMake 链接会导致:在函数 '__sti____cudaRegisterAll()' * 未定义对 '__cudaRegisterLinkedBina



我有以下CMakeList.txt:

cmake_minimum_required(VERSION 3.16)
# Options
SET(CUDA_SEPARABLE_COMPILATION ON)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
set(CUDA_ARCH -arch=sm_75)
add_definitions(-DBOOST_LOG_DYN_LINK=1 -D_REENTRANT -DARMA_ALLOW_FAKE_GCC)
#find_package(CUDA REQUIRED)
set(CMAKE_C_COMPILER /opt/gcc-10.1.0/bin/gcc) #/opt/gcc-10.1.0/bin/
set(CMAKE_CXX_COMPILER /opt/gcc-10.1.0/bin/g++) #/opt/gcc-10.1.0/bin/
set(COMPILER_LIBS /opt/gcc-10.1.0/lib64)
set(CMAKE_CUDA_COMPILER /usr/local/cuda-11.0/bin/nvcc)
string(TIMESTAMP NOW "%Y-%m-%d:%H:%M:%S")
add_definitions(-DPROJECT_LOCATION=${CMAKE_CURRENT_SOURCE_DIR} -DTIMESTAMP_CMAKE=${NOW})
SET(CMAKE_BUILD_TYPE Release) #only for debug
# -----
project(gmmfull LANGUAGES CUDA C CXX)
enable_language(CUDA)
include_directories(
/opt/armadillo-9.900.1/include
/opt/boost-1.73.0/include
/opt/itpp-4.3.1/include
/opt
/opt/cmph
/opt/itpp-4.3.1/include
/opt/intel/tbb/include
.
)
link_directories(
/opt/boost-1.73.0/lib
/opt/itpp-4.3.1/lib
/opt/intel/tbb/lib/intel64/gcc4.8
/opt/intel/mkl/lib/intel64
/opt/armadillo-9.900.1/lib64
/usr/lib64
/usr/local/cuda-11.0/targets/x86_64-linux/lib/
)

set(LIB -lstdc++ -lpthread -lboost_log -lboost_iostreams -lboost_system  -lboost_filesystem -lboost_serialization -ltbb -lm -ldl -larmadillo -lcuda -lcudart -lcudadevrt) # -lmkl_intel_ilp64 -lmkl_tbb_thread -llapack -lmkl_core
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++20 -fpermissive -fPIC -fext-numeric-literals  -DBOOST_LOG_DYN_LINK -DARMA_ALLOW_FAKE_GCC -w") #-DARMA_DONT_USE_WRAPPER -fconcepts-diagnostics-depth=4
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fPIC -DARMA_DONT_USE_WRAPPER")
if (CMAKE_BUILD_TYPE STREQUAL "Debug" OR CMAKE_BUILD_TYPE STREQUAL "DEBUG")
message("Debug config")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -ggdb -DIL_STD -w")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -ggdb")
else ()
message("Release config")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O2  -DIL_STD")
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -O2 ")
endif ()
set(CMAKE_CXX_LINK_EXECUTABLE "<CMAKE_CXX_COMPILER> <FLAGS> <CMAKE_CXX_LINK_FLAGS> <LINK_FLAGS> <OBJECTS> -o <TARGET> -L ${COMPILER_LIBS} <LINK_LIBRARIES>")
set(CUDA_PROPAGATE_HOST_FLAGS OFF)
set(CMAKE_CUDA_HOST_COMPILER "g++")
set(CMAKE_CUDA_FLAGS "-std=c++17 --device-c -Wno-deprecated-gpu-targets ${CUDA_ARCH}")
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY bin)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY bin)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY bin)
set(EXECUTABLE_OUTPUT_PATH bin)
set(RUNTIME_OUTPUT_DIRECTORY bin)
file(GLOB_RECURSE all_sources *.c *.cpp *.h *.cc *.cu)
foreach (source_path ${all_sources})
get_filename_component(name ${source_path} NAME)
string(REGEX MATCH ".*test.cpp|.*_runner.cpp|.*CMake.*|.*cython.*|.*_pch.*|pch.cpp|nbproject|NoiseImmunizedCelp|QualityImprovementModule|TestDecoder|TrainDecoder|Decoder|ExpectationMaximalization|MSQNNets/matlab/uncompilable|codegen/dll" M ${source_path})
if (M)
continue()
endif ()
list(APPEND all_not_main_sources ${source_path})
endforeach ()
add_library(globalcode ${all_not_main_sources})
set_target_properties(globalcode PROPERTIES LINKER_LANGUAGE CXX)
file(GLOB_RECURSE tests *_test.cpp *_unittest.cpp *_utest.cpp *_runner.cpp *scratch.cpp *_test.cu)
foreach (source_path ${tests})
get_filename_component(name ${source_path} NAME_WE)
string(REGEX MATCH ".*CMake.*|.*_pch.*|NoiseImmunizedCelp|QualityImprovementModule|SimplisticEnhancer|TestDecoder|TrainDecoder" M ${source_path})
if (M)
continue()
endif ()
if ("${name}" STREQUAL "")
continue()
endif ()
message("name: ${name} path: ${source_path}")
add_executable(${name} ${source_path})
target_link_libraries(${name} globalcode ${LIB} gtest ${CUDA_LIBRARIES})
endforeach ()

生成项目会导致以下输出:

[  7%] Building CXX object CMakeFiles/globalcode.dir/ArmaVecConversion/ArmaVec.cpp.o
[  7%] Building CXX object CMakeFiles/globalcode.dir/ArmaVecConversion/VecArma.cpp.o
[ 15%] Building CUDA object CMakeFiles/globalcode.dir/CudaGmmFull/CudaGmmFull_test.cu.o
[ 15%] Building CUDA object CMakeFiles/globalcode.dir/CudaHilbert/Mat.cu.o
[ 19%] Building CUDA object CMakeFiles/globalcode.dir/CudaScratches/Scratch01_test.cu.o
[ 23%] Building CUDA object CMakeFiles/globalcode.dir/CudaHilbert/Col.cu.o
[ 26%] Building CUDA object CMakeFiles/globalcode.dir/CudaHilbert/Row.cu.o
[ 30%] Building CUDA object CMakeFiles/globalcode.dir/CudaHilbert/Mat_test.cu.o
/opt/gcc-10.1.0/bin/g++  -DARMA_ALLOW_FAKE_GCC -DBOOST_LOG_DYN_LINK=1 -DPROJECT_LOCATION=/home/marcin/src/gmmfull -DTIMESTAMP_CMAKE=2020-07-01:12:48:30 -D_REENTRANT -I/opt/armadillo-9.900.1/include -I/opt/boost-1.73.0/include -I/opt/itpp-4.3.1/include -I/opt -I/opt/cmph -I/opt/intel/tbb/include -I/home/marcin/src/gmmfull/.  -std=c++20 -fpermissive -fPIC -fext-numeric-literals  -DBOOST_LOG_DYN_LINK -DARMA_ALLOW_FAKE_GCC -w -ggdb -DIL_STD -w -g   -o CMakeFiles/globalcode.dir/ArmaVecConversion/ArmaVec.cpp.o -c /home/marcin/src/gmmfull/ArmaVecConversion/ArmaVec.cpp
/opt/gcc-10.1.0/bin/g++  -DARMA_ALLOW_FAKE_GCC -DBOOST_LOG_DYN_LINK=1 -DPROJECT_LOCATION=/home/marcin/src/gmmfull -DTIMESTAMP_CMAKE=2020-07-01:12:48:30 -D_REENTRANT -I/opt/armadillo-9.900.1/include -I/opt/boost-1.73.0/include -I/opt/itpp-4.3.1/include -I/opt -I/opt/cmph -I/opt/intel/tbb/include -I/home/marcin/src/gmmfull/.  -std=c++20 -fpermissive -fPIC -fext-numeric-literals  -DBOOST_LOG_DYN_LINK -DARMA_ALLOW_FAKE_GCC -w -ggdb -DIL_STD -w -g   -o CMakeFiles/globalcode.dir/ArmaVecConversion/VecArma.cpp.o -c /home/marcin/src/gmmfull/ArmaVecConversion/VecArma.cpp
/usr/local/cuda-11.0/bin/nvcc  -DARMA_ALLOW_FAKE_GCC -DBOOST_LOG_DYN_LINK=1 -DPROJECT_LOCATION=/home/marcin/src/gmmfull -DTIMESTAMP_CMAKE=2020-07-01:12:48:30 -D_REENTRANT -I/opt/armadillo-9.900.1/include -I/opt/boost-1.73.0/include -I/opt/itpp-4.3.1/include -I/opt -I/opt/cmph -I/opt/intel/tbb/include -I/home/marcin/src/gmmfull/.  -std=c++17 --device-c -Wno-deprecated-gpu-targets -arch=sm_75 -g   -x cu -c /home/marcin/src/gmmfull/CudaGmmFull/CudaGmmFull_test.cu -o CMakeFiles/globalcode.dir/CudaGmmFull/CudaGmmFull_test.cu.o
/usr/local/cuda-11.0/bin/nvcc  -DARMA_ALLOW_FAKE_GCC -DBOOST_LOG_DYN_LINK=1 -DPROJECT_LOCATION=/home/marcin/src/gmmfull -DTIMESTAMP_CMAKE=2020-07-01:12:48:30 -D_REENTRANT -I/opt/armadillo-9.900.1/include -I/opt/boost-1.73.0/include -I/opt/itpp-4.3.1/include -I/opt -I/opt/cmph -I/opt/intel/tbb/include -I/home/marcin/src/gmmfull/.  -std=c++17 --device-c -Wno-deprecated-gpu-targets -arch=sm_75 -g   -x cu -c /home/marcin/src/gmmfull/CudaHilbert/Col.cu -o CMakeFiles/globalcode.dir/CudaHilbert/Col.cu.o
/usr/local/cuda-11.0/bin/nvcc  -DARMA_ALLOW_FAKE_GCC -DBOOST_LOG_DYN_LINK=1 -DPROJECT_LOCATION=/home/marcin/src/gmmfull -DTIMESTAMP_CMAKE=2020-07-01:12:48:30 -D_REENTRANT -I/opt/armadillo-9.900.1/include -I/opt/boost-1.73.0/include -I/opt/itpp-4.3.1/include -I/opt -I/opt/cmph -I/opt/intel/tbb/include -I/home/marcin/src/gmmfull/.  -std=c++17 --device-c -Wno-deprecated-gpu-targets -arch=sm_75 -g   -x cu -c /home/marcin/src/gmmfull/CudaHilbert/Mat.cu -o CMakeFiles/globalcode.dir/CudaHilbert/Mat.cu.o
/usr/local/cuda-11.0/bin/nvcc  -DARMA_ALLOW_FAKE_GCC -DBOOST_LOG_DYN_LINK=1 -DPROJECT_LOCATION=/home/marcin/src/gmmfull -DTIMESTAMP_CMAKE=2020-07-01:12:48:30 -D_REENTRANT -I/opt/armadillo-9.900.1/include -I/opt/boost-1.73.0/include -I/opt/itpp-4.3.1/include -I/opt -I/opt/cmph -I/opt/intel/tbb/include -I/home/marcin/src/gmmfull/.  -std=c++17 --device-c -Wno-deprecated-gpu-targets -arch=sm_75 -g   -x cu -c /home/marcin/src/gmmfull/CudaHilbert/Mat_test.cu -o CMakeFiles/globalcode.dir/CudaHilbert/Mat_test.cu.o
/usr/local/cuda-11.0/bin/nvcc  -DARMA_ALLOW_FAKE_GCC -DBOOST_LOG_DYN_LINK=1 -DPROJECT_LOCATION=/home/marcin/src/gmmfull -DTIMESTAMP_CMAKE=2020-07-01:12:48:30 -D_REENTRANT -I/opt/armadillo-9.900.1/include -I/opt/boost-1.73.0/include -I/opt/itpp-4.3.1/include -I/opt -I/opt/cmph -I/opt/intel/tbb/include -I/home/marcin/src/gmmfull/.  -std=c++17 --device-c -Wno-deprecated-gpu-targets -arch=sm_75 -g   -x cu -c /home/marcin/src/gmmfull/CudaHilbert/Row.cu -o CMakeFiles/globalcode.dir/CudaHilbert/Row.cu.o
/usr/local/cuda-11.0/bin/nvcc  -DARMA_ALLOW_FAKE_GCC -DBOOST_LOG_DYN_LINK=1 -DPROJECT_LOCATION=/home/marcin/src/gmmfull -DTIMESTAMP_CMAKE=2020-07-01:12:48:30 -D_REENTRANT -I/opt/armadillo-9.900.1/include -I/opt/boost-1.73.0/include -I/opt/itpp-4.3.1/include -I/opt -I/opt/cmph -I/opt/intel/tbb/include -I/home/marcin/src/gmmfull/.  -std=c++17 --device-c -Wno-deprecated-gpu-targets -arch=sm_75 -g   -x cu -c /home/marcin/src/gmmfull/CudaScratches/Scratch01_test.cu -o CMakeFiles/globalcode.dir/CudaScratches/Scratch01_test.cu.o
[ 34%] Building CXX object CMakeFiles/globalcode.dir/GmmFull/GmmFull.cpp.o
[ 42%] Building CXX object CMakeFiles/globalcode.dir/KLDivergence/MatrixOperations.cpp.o
[ 42%] Building CXX object CMakeFiles/globalcode.dir/KLDivergence/ExpectedKLDivergence.cpp.o
[ 46%] Building CXX object CMakeFiles/globalcode.dir/KLDivergence/subset.cpp.o
/opt/gcc-10.1.0/bin/g++  -DARMA_ALLOW_FAKE_GCC -DBOOST_LOG_DYN_LINK=1 -DPROJECT_LOCATION=/home/marcin/src/gmmfull -DTIMESTAMP_CMAKE=2020-07-01:12:48:30 -D_REENTRANT -I/opt/armadillo-9.900.1/include -I/opt/boost-1.73.0/include -I/opt/itpp-4.3.1/include -I/opt -I/opt/cmph -I/opt/intel/tbb/include -I/home/marcin/src/gmmfull/.  -std=c++20 -fpermissive -fPIC -fext-numeric-literals  -DBOOST_LOG_DYN_LINK -DARMA_ALLOW_FAKE_GCC -w -ggdb -DIL_STD -w -g   -o CMakeFiles/globalcode.dir/GmmFull/GmmFull.cpp.o -c /home/marcin/src/gmmfull/GmmFull/GmmFull.cpp
[ 53%] Building CXX object CMakeFiles/globalcode.dir/LpcLsf/LpcLsf.cpp.o
[ 53%] Building CXX object CMakeFiles/globalcode.dir/Lpc/Lpc.cpp.o
/opt/gcc-10.1.0/bin/g++  -DARMA_ALLOW_FAKE_GCC -DBOOST_LOG_DYN_LINK=1 -DPROJECT_LOCATION=/home/marcin/src/gmmfull -DTIMESTAMP_CMAKE=2020-07-01:12:48:30 -D_REENTRANT -I/opt/armadillo-9.900.1/include -I/opt/boost-1.73.0/include -I/opt/itpp-4.3.1/include -I/opt -I/opt/cmph -I/opt/intel/tbb/include -I/home/marcin/src/gmmfull/.  -std=c++20 -fpermissive -fPIC -fext-numeric-literals  -DBOOST_LOG_DYN_LINK -DARMA_ALLOW_FAKE_GCC -w -ggdb -DIL_STD -w -g   -o CMakeFiles/globalcode.dir/KLDivergence/ExpectedKLDivergence.cpp.o -c /home/marcin/src/gmmfull/KLDivergence/ExpectedKLDivergence.cpp
[ 57%] Building CXX object CMakeFiles/globalcode.dir/LpcLsf/LsfLpc.cpp.o
/opt/gcc-10.1.0/bin/g++  -DARMA_ALLOW_FAKE_GCC -DBOOST_LOG_DYN_LINK=1 -DPROJECT_LOCATION=/home/marcin/src/gmmfull -DTIMESTAMP_CMAKE=2020-07-01:12:48:30 -D_REENTRANT -I/opt/armadillo-9.900.1/include -I/opt/boost-1.73.0/include -I/opt/itpp-4.3.1/include -I/opt -I/opt/cmph -I/opt/intel/tbb/include -I/home/marcin/src/gmmfull/.  -std=c++20 -fpermissive -fPIC -fext-numeric-literals  -DBOOST_LOG_DYN_LINK -DARMA_ALLOW_FAKE_GCC -w -ggdb -DIL_STD -w -g   -o CMakeFiles/globalcode.dir/KLDivergence/MatrixOperations.cpp.o -c /home/marcin/src/gmmfull/KLDivergence/MatrixOperations.cpp
/opt/gcc-10.1.0/bin/g++  -DARMA_ALLOW_FAKE_GCC -DBOOST_LOG_DYN_LINK=1 -DPROJECT_LOCATION=/home/marcin/src/gmmfull -DTIMESTAMP_CMAKE=2020-07-01:12:48:30 -D_REENTRANT -I/opt/armadillo-9.900.1/include -I/opt/boost-1.73.0/include -I/opt/itpp-4.3.1/include -I/opt -I/opt/cmph -I/opt/intel/tbb/include -I/home/marcin/src/gmmfull/.  -std=c++20 -fpermissive -fPIC -fext-numeric-literals  -DBOOST_LOG_DYN_LINK -DARMA_ALLOW_FAKE_GCC -w -ggdb -DIL_STD -w -g   -o CMakeFiles/globalcode.dir/KLDivergence/subset.cpp.o -c /home/marcin/src/gmmfull/KLDivergence/subset.cpp
/opt/gcc-10.1.0/bin/g++  -DARMA_ALLOW_FAKE_GCC -DBOOST_LOG_DYN_LINK=1 -DPROJECT_LOCATION=/home/marcin/src/gmmfull -DTIMESTAMP_CMAKE=2020-07-01:12:48:30 -D_REENTRANT -I/opt/armadillo-9.900.1/include -I/opt/boost-1.73.0/include -I/opt/itpp-4.3.1/include -I/opt -I/opt/cmph -I/opt/intel/tbb/include -I/home/marcin/src/gmmfull/.  -std=c++20 -fpermissive -fPIC -fext-numeric-literals  -DBOOST_LOG_DYN_LINK -DARMA_ALLOW_FAKE_GCC -w -ggdb -DIL_STD -w -g   -o CMakeFiles/globalcode.dir/Lpc/Lpc.cpp.o -c /home/marcin/src/gmmfull/Lpc/Lpc.cpp
/opt/gcc-10.1.0/bin/g++  -DARMA_ALLOW_FAKE_GCC -DBOOST_LOG_DYN_LINK=1 -DPROJECT_LOCATION=/home/marcin/src/gmmfull -DTIMESTAMP_CMAKE=2020-07-01:12:48:30 -D_REENTRANT -I/opt/armadillo-9.900.1/include -I/opt/boost-1.73.0/include -I/opt/itpp-4.3.1/include -I/opt -I/opt/cmph -I/opt/intel/tbb/include -I/home/marcin/src/gmmfull/.  -std=c++20 -fpermissive -fPIC -fext-numeric-literals  -DBOOST_LOG_DYN_LINK -DARMA_ALLOW_FAKE_GCC -w -ggdb -DIL_STD -w -g   -o CMakeFiles/globalcode.dir/LpcLsf/LpcLsf.cpp.o -c /home/marcin/src/gmmfull/LpcLsf/LpcLsf.cpp
/opt/gcc-10.1.0/bin/g++  -DARMA_ALLOW_FAKE_GCC -DBOOST_LOG_DYN_LINK=1 -DPROJECT_LOCATION=/home/marcin/src/gmmfull -DTIMESTAMP_CMAKE=2020-07-01:12:48:30 -D_REENTRANT -I/opt/armadillo-9.900.1/include -I/opt/boost-1.73.0/include -I/opt/itpp-4.3.1/include -I/opt -I/opt/cmph -I/opt/intel/tbb/include -I/home/marcin/src/gmmfull/.  -std=c++20 -fpermissive -fPIC -fext-numeric-literals  -DBOOST_LOG_DYN_LINK -DARMA_ALLOW_FAKE_GCC -w -ggdb -DIL_STD -w -g   -o CMakeFiles/globalcode.dir/LpcLsf/LsfLpc.cpp.o -c /home/marcin/src/gmmfull/LpcLsf/LsfLpc.cpp
[ 61%] Building CXX object CMakeFiles/globalcode.dir/MultiIndexProbability/MultiIndex.cpp.o
/opt/gcc-10.1.0/bin/g++  -DARMA_ALLOW_FAKE_GCC -DBOOST_LOG_DYN_LINK=1 -DPROJECT_LOCATION=/home/marcin/src/gmmfull -DTIMESTAMP_CMAKE=2020-07-01:12:48:30 -D_REENTRANT -I/opt/armadillo-9.900.1/include -I/opt/boost-1.73.0/include -I/opt/itpp-4.3.1/include -I/opt -I/opt/cmph -I/opt/intel/tbb/include -I/home/marcin/src/gmmfull/.  -std=c++20 -fpermissive -fPIC -fext-numeric-literals  -DBOOST_LOG_DYN_LINK -DARMA_ALLOW_FAKE_GCC -w -ggdb -DIL_STD -w -g   -o CMakeFiles/globalcode.dir/MultiIndexProbability/MultiIndex.cpp.o -c /home/marcin/src/gmmfull/MultiIndexProbability/MultiIndex.cpp
[ 65%] Building CXX object CMakeFiles/globalcode.dir/Utils/CRC32.cpp.o
[ 69%] Building CXX object CMakeFiles/globalcode.dir/Utils/CustomFILE.cpp.o
[ 73%] Building CXX object CMakeFiles/globalcode.dir/Utils/LibUtils.cpp.o
/opt/gcc-10.1.0/bin/g++  -DARMA_ALLOW_FAKE_GCC -DBOOST_LOG_DYN_LINK=1 -DPROJECT_LOCATION=/home/marcin/src/gmmfull -DTIMESTAMP_CMAKE=2020-07-01:12:48:30 -D_REENTRANT -I/opt/armadillo-9.900.1/include -I/opt/boost-1.73.0/include -I/opt/itpp-4.3.1/include -I/opt -I/opt/cmph -I/opt/intel/tbb/include -I/home/marcin/src/gmmfull/.  -std=c++20 -fpermissive -fPIC -fext-numeric-literals  -DBOOST_LOG_DYN_LINK -DARMA_ALLOW_FAKE_GCC -w -ggdb -DIL_STD -w -g   -o CMakeFiles/globalcode.dir/Utils/CRC32.cpp.o -c /home/marcin/src/gmmfull/Utils/CRC32.cpp
/opt/gcc-10.1.0/bin/g++  -DARMA_ALLOW_FAKE_GCC -DBOOST_LOG_DYN_LINK=1 -DPROJECT_LOCATION=/home/marcin/src/gmmfull -DTIMESTAMP_CMAKE=2020-07-01:12:48:30 -D_REENTRANT -I/opt/armadillo-9.900.1/include -I/opt/boost-1.73.0/include -I/opt/itpp-4.3.1/include -I/opt -I/opt/cmph -I/opt/intel/tbb/include -I/home/marcin/src/gmmfull/.  -std=c++20 -fpermissive -fPIC -fext-numeric-literals  -DBOOST_LOG_DYN_LINK -DARMA_ALLOW_FAKE_GCC -w -ggdb -DIL_STD -w -g   -o CMakeFiles/globalcode.dir/Utils/CustomFILE.cpp.o -c /home/marcin/src/gmmfull/Utils/CustomFILE.cpp
/opt/gcc-10.1.0/bin/g++  -DARMA_ALLOW_FAKE_GCC -DBOOST_LOG_DYN_LINK=1 -DPROJECT_LOCATION=/home/marcin/src/gmmfull -DTIMESTAMP_CMAKE=2020-07-01:12:48:30 -D_REENTRANT -I/opt/armadillo-9.900.1/include -I/opt/boost-1.73.0/include -I/opt/itpp-4.3.1/include -I/opt -I/opt/cmph -I/opt/intel/tbb/include -I/home/marcin/src/gmmfull/.  -std=c++20 -fpermissive -fPIC -fext-numeric-literals  -DBOOST_LOG_DYN_LINK -DARMA_ALLOW_FAKE_GCC -w -ggdb -DIL_STD -w -g   -o CMakeFiles/globalcode.dir/Utils/LibUtils.cpp.o -c /home/marcin/src/gmmfull/Utils/LibUtils.cpp
[ 76%] Building CXX object CMakeFiles/globalcode.dir/Utils/Logger.cpp.o
/opt/gcc-10.1.0/bin/g++  -DARMA_ALLOW_FAKE_GCC -DBOOST_LOG_DYN_LINK=1 -DPROJECT_LOCATION=/home/marcin/src/gmmfull -DTIMESTAMP_CMAKE=2020-07-01:12:48:30 -D_REENTRANT -I/opt/armadillo-9.900.1/include -I/opt/boost-1.73.0/include -I/opt/itpp-4.3.1/include -I/opt -I/opt/cmph -I/opt/intel/tbb/include -I/home/marcin/src/gmmfull/.  -std=c++20 -fpermissive -fPIC -fext-numeric-literals  -DBOOST_LOG_DYN_LINK -DARMA_ALLOW_FAKE_GCC -w -ggdb -DIL_STD -w -g   -o CMakeFiles/globalcode.dir/Utils/Logger.cpp.o -c /home/marcin/src/gmmfull/Utils/Logger.cpp
[ 80%] Building CXX object CMakeFiles/globalcode.dir/Utils/PlotUtils.cpp.o
/opt/gcc-10.1.0/bin/g++  -DARMA_ALLOW_FAKE_GCC -DBOOST_LOG_DYN_LINK=1 -DPROJECT_LOCATION=/home/marcin/src/gmmfull -DTIMESTAMP_CMAKE=2020-07-01:12:48:30 -D_REENTRANT -I/opt/armadillo-9.900.1/include -I/opt/boost-1.73.0/include -I/opt/itpp-4.3.1/include -I/opt -I/opt/cmph -I/opt/intel/tbb/include -I/home/marcin/src/gmmfull/.  -std=c++20 -fpermissive -fPIC -fext-numeric-literals  -DBOOST_LOG_DYN_LINK -DARMA_ALLOW_FAKE_GCC -w -ggdb -DIL_STD -w -g   -o CMakeFiles/globalcode.dir/Utils/PlotUtils.cpp.o -c /home/marcin/src/gmmfull/Utils/PlotUtils.cpp
[ 88%] Building CXX object CMakeFiles/globalcode.dir/Utils/RandomUtils.cpp.o
[ 88%] Building CXX object CMakeFiles/globalcode.dir/VoiceActivityDetection/Vad.cpp.o
/opt/gcc-10.1.0/bin/g++  -DARMA_ALLOW_FAKE_GCC -DBOOST_LOG_DYN_LINK=1 -DPROJECT_LOCATION=/home/marcin/src/gmmfull -DTIMESTAMP_CMAKE=2020-07-01:12:48:30 -D_REENTRANT -I/opt/armadillo-9.900.1/include -I/opt/boost-1.73.0/include -I/opt/itpp-4.3.1/include -I/opt -I/opt/cmph -I/opt/intel/tbb/include -I/home/marcin/src/gmmfull/.  -std=c++20 -fpermissive -fPIC -fext-numeric-literals  -DBOOST_LOG_DYN_LINK -DARMA_ALLOW_FAKE_GCC -w -ggdb -DIL_STD -w -g   -o CMakeFiles/globalcode.dir/VoiceActivityDetection/Vad.cpp.o -c /home/marcin/src/gmmfull/VoiceActivityDetection/Vad.cpp
/opt/gcc-10.1.0/bin/g++  -DARMA_ALLOW_FAKE_GCC -DBOOST_LOG_DYN_LINK=1 -DPROJECT_LOCATION=/home/marcin/src/gmmfull -DTIMESTAMP_CMAKE=2020-07-01:12:48:30 -D_REENTRANT -I/opt/armadillo-9.900.1/include -I/opt/boost-1.73.0/include -I/opt/itpp-4.3.1/include -I/opt -I/opt/cmph -I/opt/intel/tbb/include -I/home/marcin/src/gmmfull/.  -std=c++20 -fpermissive -fPIC -fext-numeric-literals  -DBOOST_LOG_DYN_LINK -DARMA_ALLOW_FAKE_GCC -w -ggdb -DIL_STD -w -g   -o CMakeFiles/globalcode.dir/Utils/RandomUtils.cpp.o -c /home/marcin/src/gmmfull/Utils/RandomUtils.cpp
/opt/armadillo-9.900.1/include/armadillo_bits/def_hdf5.hpp(149): warning: using-declaration ignored -- it refers to the current namespace
/opt/armadillo-9.900.1/include/armadillo_bits/def_hdf5.hpp(150): warning: using-declaration ignored -- it refers to the current namespace
/opt/armadillo-9.900.1/include/armadillo_bits/arma_static_check.hpp(31): warning: const variable "junk" requires an initializer
/opt/armadillo-9.900.1/include/armadillo_bits/def_hdf5.hpp(149): warning: using-declaration ignored -- it refers to the current namespace
/opt/armadillo-9.900.1/include/armadillo_bits/def_hdf5.hpp(150): warning: using-declaration ignored -- it refers to the current namespace
[ 92%] Linking CXX static library bin/libglobalcode.a
/opt/clion-2020.1.2/bin/cmake/linux/bin/cmake -P CMakeFiles/globalcode.dir/cmake_clean_target.cmake
/opt/clion-2020.1.2/bin/cmake/linux/bin/cmake -E cmake_link_script CMakeFiles/globalcode.dir/link.txt --verbose=1
/usr/bin/ar qc bin/libglobalcode.a  CMakeFiles/globalcode.dir/ArmaVecConversion/ArmaVec.cpp.o CMakeFiles/globalcode.dir/ArmaVecConversion/VecArma.cpp.o CMakeFiles/globalcode.dir/CudaGmmFull/CudaGmmFull_test.cu.o CMakeFiles/globalcode.dir/CudaHilbert/Col.cu.o CMakeFiles/globalcode.dir/CudaHilbert/Mat.cu.o CMakeFiles/globalcode.dir/CudaHilbert/Mat_test.cu.o CMakeFiles/globalcode.dir/CudaHilbert/Row.cu.o CMakeFiles/globalcode.dir/CudaScratches/Scratch01_test.cu.o CMakeFiles/globalcode.dir/GmmFull/GmmFull.cpp.o CMakeFiles/globalcode.dir/KLDivergence/ExpectedKLDivergence.cpp.o CMakeFiles/globalcode.dir/KLDivergence/MatrixOperations.cpp.o CMakeFiles/globalcode.dir/KLDivergence/subset.cpp.o CMakeFiles/globalcode.dir/Lpc/Lpc.cpp.o CMakeFiles/globalcode.dir/LpcLsf/LpcLsf.cpp.o CMakeFiles/globalcode.dir/LpcLsf/LsfLpc.cpp.o CMakeFiles/globalcode.dir/MultiIndexProbability/MultiIndex.cpp.o CMakeFiles/globalcode.dir/Utils/CRC32.cpp.o CMakeFiles/globalcode.dir/Utils/CustomFILE.cpp.o CMakeFiles/globalcode.dir/Utils/LibUtils.cpp.o CMakeFiles/globalcode.dir/Utils/Logger.cpp.o CMakeFiles/globalcode.dir/Utils/PlotUtils.cpp.o CMakeFiles/globalcode.dir/Utils/RandomUtils.cpp.o CMakeFiles/globalcode.dir/VoiceActivityDetection/Vad.cpp.o
/usr/bin/ranlib bin/libglobalcode.a
gmake[3]: Opuszczenie katalogu '/home/marcin/src/gmmfull/cmake-build-debug'
[ 92%] Built target globalcode
/usr/bin/gmake -f CMakeFiles/CudaGmmFull_test.dir/build.make CMakeFiles/CudaGmmFull_test.dir/depend
gmake[3]: Wejście do katalogu '/home/marcin/src/gmmfull/cmake-build-debug'
cd /home/marcin/src/gmmfull/cmake-build-debug && /opt/clion-2020.1.2/bin/cmake/linux/bin/cmake -E cmake_depends "Unix Makefiles" /home/marcin/src/gmmfull /home/marcin/src/gmmfull /home/marcin/src/gmmfull/cmake-build-debug /home/marcin/src/gmmfull/cmake-build-debug /home/marcin/src/gmmfull/cmake-build-debug/CMakeFiles/CudaGmmFull_test.dir/DependInfo.cmake --color=
Dependee "/home/marcin/src/gmmfull/cmake-build-debug/CMakeFiles/CudaGmmFull_test.dir/DependInfo.cmake" is newer than depender "/home/marcin/src/gmmfull/cmake-build-debug/CMakeFiles/CudaGmmFull_test.dir/depend.internal".
Scanning dependencies of target CudaGmmFull_test
gmake[3]: Opuszczenie katalogu '/home/marcin/src/gmmfull/cmake-build-debug'
/usr/bin/gmake -f CMakeFiles/CudaGmmFull_test.dir/build.make CMakeFiles/CudaGmmFull_test.dir/build
gmake[3]: Wejście do katalogu '/home/marcin/src/gmmfull/cmake-build-debug'
[ 96%] Building CUDA object CMakeFiles/CudaGmmFull_test.dir/CudaGmmFull/CudaGmmFull_test.cu.o
/usr/local/cuda-11.0/bin/nvcc  -DARMA_ALLOW_FAKE_GCC -DBOOST_LOG_DYN_LINK=1 -DPROJECT_LOCATION=/home/marcin/src/gmmfull -DTIMESTAMP_CMAKE=2020-07-01:12:48:30 -D_REENTRANT -I/opt/armadillo-9.900.1/include -I/opt/boost-1.73.0/include -I/opt/itpp-4.3.1/include -I/opt -I/opt/cmph -I/opt/intel/tbb/include -I/home/marcin/src/gmmfull/.  -std=c++17 --device-c -Wno-deprecated-gpu-targets -arch=sm_75 -g   -x cu -c /home/marcin/src/gmmfull/CudaGmmFull/CudaGmmFull_test.cu -o CMakeFiles/CudaGmmFull_test.dir/CudaGmmFull/CudaGmmFull_test.cu.o
/opt/armadillo-9.900.1/include/armadillo_bits/def_hdf5.hpp(149): warning: using-declaration ignored -- it refers to the current namespace
/opt/armadillo-9.900.1/include/armadillo_bits/def_hdf5.hpp(150): warning: using-declaration ignored -- it refers to the current namespace
/opt/armadillo-9.900.1/include/armadillo_bits/arma_static_check.hpp(31): warning: const variable "junk" requires an initializer
/opt/armadillo-9.900.1/include/armadillo_bits/def_hdf5.hpp(149): warning: using-declaration ignored -- it refers to the current namespace
/opt/armadillo-9.900.1/include/armadillo_bits/def_hdf5.hpp(150): warning: using-declaration ignored -- it refers to the current namespace
[100%] Linking CXX executable bin/CudaGmmFull_test
/opt/clion-2020.1.2/bin/cmake/linux/bin/cmake -E cmake_link_script CMakeFiles/CudaGmmFull_test.dir/link.txt --verbose=1
/opt/gcc-10.1.0/bin/g++  -std=c++20 -fpermissive -fPIC -fext-numeric-literals  -DBOOST_LOG_DYN_LINK -DARMA_ALLOW_FAKE_GCC -w -ggdb -DIL_STD -w -g   CMakeFiles/CudaGmmFull_test.dir/CudaGmmFull/CudaGmmFull_test.cu.o -o bin/CudaGmmFull_test -L /opt/gcc-10.1.0/lib64   -L/opt/boost-1.73.0/lib  -L/opt/itpp-4.3.1/lib  -L/opt/intel/tbb/lib/intel64/gcc4.8  -L/opt/intel/mkl/lib/intel64  -L/opt/armadillo-9.900.1/lib64  -L/usr/local/cuda-11.0/targets/x86_64-linux/lib  -L/usr/local/cuda-11.0/targets/x86_64-linux/lib/stubs  -L/usr/lib/gcc/x86_64-redhat-linux/8  -Wl,-rpath,/opt/boost-1.73.0/lib:/opt/itpp-4.3.1/lib:/opt/intel/tbb/lib/intel64/gcc4.8:/opt/intel/mkl/lib/intel64:/opt/armadillo-9.900.1/lib64:/usr/local/cuda-11.0/targets/x86_64-linux/lib bin/libglobalcode.a -lstdc++ -lpthread -lboost_log -lboost_iostreams -lboost_system -lboost_filesystem -lboost_serialization -ltbb -lm -ldl -larmadillo -lcuda -lcudart -lcudadevrt -lgtest -lcudadevrt -lcudart_static -lrt -lpthread -ldl 
CMakeFiles/CudaGmmFull_test.dir/CudaGmmFull/CudaGmmFull_test.cu.o: In function `__sti____cudaRegisterAll()':
/tmp/tmpxft_0000a8df_00000000-5_CudaGmmFull_test.cudafe1.stub.c:76: undefined reference to `__cudaRegisterLinkedBinary_51_tmpxft_0000a8df_00000000_6_CudaGmmFull_test_cpp1_ii_0bb2e10d'
bin/libglobalcode.a(Mat.cu.o): In function `__sti____cudaRegisterAll()':
/tmp/tmpxft_0000a83b_00000000-5_Mat.cudafe1.stub.c:14: undefined reference to `__cudaRegisterLinkedBinary_38_tmpxft_0000a83b_00000000_6_Mat_cpp1_ii_f5cb6875'
collect2: error: ld returned 1 exit status
gmake[3]: *** [CMakeFiles/CudaGmmFull_test.dir/build.make:88: bin/CudaGmmFull_test] Błąd 1
gmake[3]: Opuszczenie katalogu '/home/marcin/src/gmmfull/cmake-build-debug'
gmake[2]: *** [CMakeFiles/Makefile2:360: CMakeFiles/CudaGmmFull_test.dir/all] Błąd 2
gmake[2]: Opuszczenie katalogu '/home/marcin/src/gmmfull/cmake-build-debug'
gmake[1]: *** [CMakeFiles/Makefile2:367: CMakeFiles/CudaGmmFull_test.dir/rule] Błąd 2
gmake[1]: Opuszczenie katalogu '/home/marcin/src/gmmfull/cmake-build-debug'
gmake: *** [Makefile:238: CudaGmmFull_test] Błąd 2

除了一些无辜的警告外,以下编译指令还会导致上述错误:

/opt/gcc-10.1.0/bin/g++  -std=c++20 -fpermissive -fPIC -fext-numeric-literals  -DBOOST_LOG_DYN_LINK -DARMA_ALLOW_FAKE_GCC -w -ggdb -DIL_STD -w -g   CMakeFiles/CudaGmmFull_test.dir/CudaGmmFull/CudaGmmFull_test.cu.o -o bin/CudaGmmFull_test -L /opt/gcc-10.1.0/lib64   -L/opt/boost-1.73.0/lib  -L/opt/itpp-4.3.1/lib  -L/opt/intel/tbb/lib/intel64/gcc4.8  -L/opt/intel/mkl/lib/intel64  -L/opt/armadillo-9.900.1/lib64  -L/usr/local/cuda-11.0/targets/x86_64-linux/lib  -L/usr/local/cuda-11.0/targets/x86_64-linux/lib/stubs  -L/usr/lib/gcc/x86_64-redhat-linux/8  -Wl,-rpath,/opt/boost-1.73.0/lib:/opt/itpp-4.3.1/lib:/opt/intel/tbb/lib/intel64/gcc4.8:/opt/intel/mkl/lib/intel64:/opt/armadillo-9.900.1/lib64:/usr/local/cuda-11.0/targets/x86_64-linux/lib bin/libglobalcode.a -lstdc++ -lpthread -lboost_log -lboost_iostreams -lboost_system -lboost_filesystem -lboost_serialization -ltbb -lm -ldl -larmadillo -lcuda -lcudart -lcudadevrt -lgtest -lcudadevrt -lcudart_static -lrt -lpthread -ldl

将 -dc 选项添加到 NVCC 后会出现此错误。如果没有 -dc 选项,单独的编译不起作用,并且我的其他 .cu 文件中还有一些其他未定义的符号。

请帮助我克服这个问题。

我找到了一个正确的解决方案,有两件事对于找到该解决方案很重要:

  • 首先,我必须使用兼容的编译器,即G ++ 8.3.1,而不是最新的10.1.0
  • 重要的是正确使用CUDA_SEPARABLE_COMPILATION属性

下面是完整的 CMakeList.txt它现在可以编译整个代码而不会出错:

cmake_minimum_required(VERSION 3.16)

# Options
set(CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} -arch=sm_75" CACHE STRING "")
add_compile_definitions(BOOST_LOG_DYN_LINK=1 _REENTRANT ARMA_ALLOW_FAKE_GCC PROJECT_LOCATION=${CMAKE_CURRENT_SOURCE_DIR} TIMESTAMP_CMAKE=${NOW})
set(CMAKE_CXX_COMPILER g++)
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CUDA_COMPILER /usr/local/cuda-11.0/bin/nvcc)
set(CMAKE_CUDA_STANDARD 14)
string(TIMESTAMP NOW "%Y-%m-%d:%H:%M:%S")

project(gmmfull VERSION 0.1 LANGUAGES CUDA CXX)
include_directories(
/opt/armadillo-9.900.1/include
/opt/boost-1.73.0/include
/opt/itpp-4.3.1/include
/opt
/opt/cmph
/opt/intel/tbb/include
.
)
link_directories(
/opt/boost-1.73.0/lib
/opt/itpp-4.3.1/lib
/opt/intel/tbb/lib/intel64/gcc4.8
/opt/intel/mkl/lib/intel64
/opt/armadillo-9.900.1/lib64
/usr/lib64
/usr/local/cuda-11.0/targets/x86_64-linux/lib/
)

set(LIB -lstdc++ -lpthread -lboost_log -lboost_iostreams -lboost_system  -lboost_filesystem -lboost_serialization -ltbb -lm -ldl -larmadillo -lcuda -lcudart -lcudadevrt -lcurand) # -lmkl_intel_ilp64 -lmkl_tbb_thread -llapack -lmkl_core
set(CMAKE_CXX_FLAGS "-fpermissive -fPIC -fext-numeric-literals -w") #
set(CMAKE_CXX_FLAGS_RELEASE  "-O3")
set(CMAKE_CXX_FLAGS_DEBUG "-O0 -g")
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY bin)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY bin)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY bin)
set(EXECUTABLE_OUTPUT_PATH bin)
set(RUNTIME_OUTPUT_DIRECTORY bin)
file(GLOB_RECURSE all_sources *.c *.cpp *.h *.cc *.cu)
foreach (source_path ${all_sources})
get_filename_component(name ${source_path} NAME)
string(REGEX MATCH ".*test.cpp|.*test.cu|.*_runner.cpp|.*CMake.*|.*cython.*|.*_pch.*|pch.cpp" M ${source_path})
if (M)
continue()
endif ()
list(APPEND all_not_main_sources ${source_path})
endforeach ()
file(GLOB_RECURSE tests *_test.cpp *_unittest.cpp *_utest.cpp *_runner.cpp *scratch.cpp *_test.cu)
foreach (source_path ${tests})
get_filename_component(name ${source_path} NAME_WE)
string(REGEX MATCH ".*CMake.*|.*_pch.*|NoiseImmunizedCelp|QualityImprovementModule|SimplisticEnhancer|TestDecoder|TrainDecoder" M ${source_path})
if (M)
continue()
endif ()
if ("${name}" STREQUAL "")
continue()
endif ()
message("name: ${name} path: ${source_path}")
add_executable(${name} ${source_path} ${all_not_main_sources})
target_link_libraries(${name} ${LIB})
set_property(TARGET ${name}
PROPERTY CUDA_SEPARABLE_COMPILATION ON)
endforeach ()

最新更新