Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • Users
  • Groups
  • Search
  • Get Qt Extensions
  • Unsolved
Collapse
Brand Logo
  1. Home
  2. Qt Development
  3. General and Desktop
  4. QtCreator. CUDA. Make final linking with NVCC
Forum Updated to NodeBB v4.3 + New Features

QtCreator. CUDA. Make final linking with NVCC

Scheduled Pinned Locked Moved Solved General and Desktop
18 Posts 4 Posters 6.6k Views 2 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • S Offline
    S Offline
    Sacha_D
    wrote on last edited by
    #1

    Hello. I found many examples of CUDA + Qt in Internet, but they all were compiled with -c option of nvcc compiler. I need also -dc -rdc=true options too. When I enable them, I got error: undefined reference to cudaRegisterLinkedBinary. I found this topic
    cuda shared library linking: undefined reference to cudaRegisterLinkedBinary on StackOverflow. How to implement it in QtCreator? As I understood it needs to make final linking with nvcc, not g++.

    1 Reply Last reply
    0
    • SGaistS Offline
      SGaistS Offline
      SGaist
      Lifetime Qt Champion
      wrote on last edited by
      #2

      Hi,

      What are you using currently to build your CUDA kernels ?

      Interested in AI ? www.idiap.ch
      Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

      1 Reply Last reply
      0
      • S Offline
        S Offline
        Sacha_D
        wrote on last edited by
        #3

        This .pro file, that I downloaded from github and corrected for myself with my experience:

        #-------------------------------------------------
        #
        # Project created by QtCreator 2019-12-10T19:31:27
        #
        #-------------------------------------------------
        
        QT       += core gui
        
        greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
        
        TARGET = 13-word-correction-fnn
        TEMPLATE = app
        # The following define makes your compiler emit warnings if you use
        # any feature of Qt which has been marked as deprecated (the exact warnings
        # depend on your compiler). Please consult the documentation of the
        # deprecated API in order to know how to port your code away from it.
        DEFINES += QT_DEPRECATED_WARNINGS
        
        # You can also make your code fail to compile if you use deprecated APIs.
        # In order to do so, uncomment the following line.
        # You can also select to disable deprecated APIs only up to a certain version of Qt.
        #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0
        
        
        SOURCES += \
                main.cpp \
                mainwindow.cpp
        
        HEADERS += \
                mainwindow.h \
                word-correction-fnn-cuda.h \
                actfunc.h
        
        FORMS += \
                mainwindow.ui
        
        QMAKE_CXXFLAGS += "-fno-sized-deallocation"
        
        # Cuda sources
        CUDA_SOURCES += word-correction-fnn-thrust.cu \
                        word-correction-fnn-cuda.cu \
                        actfunc.cu
        # Project dir and outputs
        PROJECT_DIR = $$system(pwd)
        OBJECTS_DIR = $$PROJECT_DIR/Obj
        DESTDIR = ../bin
        # Path to cuda toolkit install
        CUDA_DIR = /usr/local/cuda
        # GPU architecture
        #https://docs.nvidia.com/cuda/cuda-compiler-driver-nvcc/index.html#virtual-architecture-feature-list
        CUDA_VARCH = compute_35
        #https://docs.nvidia.com/cuda/cuda-compiler-driver-nvcc/index.html#gpu-feature-list-dc -rdc=true
        CUDA_GPU_ARCH = sm_35
        
        # nvcc flags (ptxas option verbose is always useful)
        NVCCFLAGS = --compiler-options -use-fast-math --Wno-deprecated-gpu-targets
        # include paths
        INCLUDEPATH += $$CUDA_DIR/include
        #INCLUDEPATH += /opt/cub/cub         #Поддержка заголовочных файлов библиотеки CUB (Более производительная и низкоуровневая замена Thrust)
        # include paths
        #INCLUDEPATH += /usr/local/cuda/include
        # lib dirs
        QMAKE_LIBDIR += $$CUDA_DIR/lib64
        # libs - note than i'm using a x_86_64 machine
        LIBS += -lcuda -lcudart -lcurand
        # join the includes in a line
        CUDA_INC = $$join(INCLUDEPATH,' -I','-I',' ')
        
        # Prepare the extra compiler configuration (taken from the nvidia forum - i'm not an expert in this part)
        cuda.input = CUDA_SOURCES
        cuda.output = ${OBJECTS_DIR}${QMAKE_FILE_BASE}_cuda.o
        
        #Улучшенный вывод сообещний об ошибках. Более понятный для QtCreator, чтобы можно было по двойному щелчку переходить к строке в файле
        
        #Параметр -dc __device__ функцию используемую __kernel__ функцией в одном файле, можно объявить/определить в другом файле
        #-dc == --device-c -> Compile each .c, .cc, .cpp, .cxx, and .cu input file into an object file that contains relocatable device code.
        # -rdc=true|false == relocatable device code
        #-dc is equivalent to --relocatable-device-code=true
        #--compiler-options '-fPIC' -dc −rdc=true
        
        #Если добавить -x, то nvcc будет воспринимать .cpp файлы, как .cu (содержащие cuda-код).
        #Должен будет более адекватно работать QtCreator, эти .cpp файлы всё равно надо будет происывать в CUDA_SOURCES.
        #Но для наглядности лучше оставить их .cu и эту опцию не использовать. Иначе можно запутаться.
        CONFIG(debug, debug|release) {
        # NEED: cuda.commands = $$CUDA_DIR/bin/nvcc -m64 -g -G -gencode arch=$$CUDA_VARCH,code=$$CUDA_GPU_ARCH -c -dc -rdc=true $$NVCCFLAGS \   !!!!!!!!!!!!!!!!!!!!!
        cuda.commands = $$CUDA_DIR/bin/nvcc -m64 -g -G -gencode arch=$$CUDA_VARCH,code=$$CUDA_GPU_ARCH -c $$NVCCFLAGS \
                        $$CUDA_INC $$LIBS  ${QMAKE_FILE_NAME} -o ${QMAKE_FILE_OUT} \
                        2>&1 | sed -r \"s/\\(([0-9]+)\\)/:\\1/g\" 1>&2
        }
        else {
        cuda.commands = $$CUDA_DIR/bin/nvcc -m64 -O3 -gencode arch=$$CUDA_VARCH,code=$$CUDA_GPU_ARCH -c $$NVCCFLAGS \
                        $$CUDA_INC $$LIBS  ${QMAKE_FILE_NAME} -o ${QMAKE_FILE_OUT} \
                        2>&1 | sed -r \"s/\\(([0-9]+)\\)/:\\1/g\" 1>&2
        }
        
        #Оригинал с GitHub
        #cuda.commands = $$CUDA_DIR/bin/nvcc -m64 -g -G -gencode arch=$$CUDA_VARCH,code=$$CUDA_GPU_ARCH -c $$NVCCFLAGS $$CUDA_INC $$LIBS  ${QMAKE_FILE_NAME} -o ${QMAKE_FILE_OUT}
        
        cuda.dependency_type = TYPE_C # there was a typo here. Thanks workmate!
        
        CONFIG(debug, debug|release) {
            cuda.depend_command = $$CUDA_DIR/bin/nvcc -g -G -M $$CUDA_INC $$NVCCFLAGS   ${QMAKE_FILE_NAME}  | sed \"s/^.*: //\"
        }
        else {
            cuda.depend_command = $$CUDA_DIR/bin/nvcc -O3 -M $$CUDA_INC $$NVCCFLAGS   ${QMAKE_FILE_NAME}  | sed \"s/^.*: //\"
        }
        
        # Tell Qt that we want add more stuff to the Makefile
        QMAKE_EXTRA_UNIX_COMPILERS += cuda
        
        
        
        1 Reply Last reply
        0
        • G Offline
          G Offline
          Gerd
          wrote on last edited by
          #4

          Hi,
          you don't need to do the final link with nvcc, but relocatable cuda-code needs a link pass.
          I had the same problem some times ago, found a solution in the net and changed it to my needs.
          If you want to use this, you have to to the following steps:

          • save the code below as "cuda.pri"
          • remove all cuda related stuff from your pro-file
          • put the cuda sources in a node named "CUSOURCES"
          • create an empty file file named "cu_devlink.cu" (or any other name) and put it in a node named "CUDEVLINK"
          • include the cuda.pri file into your pro-file
          • add an evironment var named "CUDA_PATH" to your environmnet (or change the pri-file, whatever you like)
          • check all settings in the cuda.pri and make the changes you need before starting qmake!

          With this all cu-files will be compiled without linking, and as a prelink step all cuda files will be linked together in one obj file that is finally given, together with your other obj-files, to the standard linker.

          Gerd

          CUDA_BASE=$$quote($$clean_path($$(CUDA_PATH)))
          isEmpty( CUDA_BASE ) {
          	error("environment-variable CUDA_PATH is not defined!")
          }
          CUDA_BIN_PATH=$$CUDA_BASE/bin
          CUDA_INC_PATH=$$CUDA_BASE/include
          CUDA_LIB_PATH=$$CUDA_BASE/lib
          !contains(QMAKE_HOST.arch, x86_64) {
             CUDA_LIB_PATH=$$CUDA_LIB_PATH/win32
          } else {
             CUDA_LIB_PATH=$$CUDA_LIB_PATH/x64
          }	
          
          # GPU architecture
          CUDA_ARCH = sm_52
          
          # Add the necessary libraries
          # CUDA < 9.0
          #CUDA_LIBS=cudart_static nppi nppc 
          # CUDA >= 10.0
          CUDA_LIBS=cuda cudart_static nppc curand cudadevrt
          
          
          # setting the CUdaCompiler
          QMAKE_CUC = $$CUDA_BIN_PATH/nvcc.exe
          win32 {
          	!exists($$QMAKE_CUC) {
          		warning("can't find cuda compiler($$QMAKE_CUC)")
          	}
          	!exists($$CUDA_INC_PATH/cuda.h) {
          		warning("can't find cuda include ($$CUDA_INC_PATH/cuda.h)")
          	}
          	!exists($$CUDA_LIB_PATH/cuda.lib) {
          		warning("can't find cuda lib ($$CUDA_LIB_PATH/cuda.lib)")
          	}
          }
          
          # Cuda extra-compiler for handling files specified in the CUSOURCES variable
          {
             cu.name = Cuda Sourcefiles
          	cu.input = CUSOURCES
          	cu.dependency_type = TYPE_C
          	cu.CONFIG += no_link
          	cu.variable_out = OBJECTS
          	isEmpty(QMAKE_CUC) {
                win32:QMAKE_CUC = $$CUDA_BIN_PATH/nvcc.exe
                else:QMAKE_CUC = nvcc
          	}
          
          	isEmpty(CU_DIR):CU_DIR = .
          	isEmpty(QMAKE_CPP_MOD_CU):QMAKE_CPP_MOD_CU = cu_
          	isEmpty(QMAKE_EXT_CPP_CU):QMAKE_EXT_CPP_CU = .cu
          	INCLUDEPATH += $$CUDA_INC_PATH
          
             CONFIG(debug, debug|release) {
                QMAKE_CUFLAGS += $$QMAKE_CXXFLAGS $$QMAKE_CXXFLAGS_DEBUG $$QMAKE_CXXFLAGS_RTTI_ON $$QMAKE_CXXFLAGS_WARN_ON $$QMAKE_CXXFLAGS_STL_ON 
          		QMAKE_NVVFLAGS += -G
             } 	
             CONFIG(release, debug|release) {
                QMAKE_CUFLAGS += $$QMAKE_CXXFLAGS $$QMAKE_CXXFLAGS_RELEASE $$QMAKE_CXXFLAGS_RTTI_ON $$QMAKE_CXXFLAGS_WARN_ON $$QMAKE_CXXFLAGS_STL_ON 
             } 	
          	#since qt5.9 they use /Zc:rvalueCast- /Zc:inline- in the msvc-mkspecs
          	# we have to switch that off!! 
          	# else linking __device__ __managed__ vars wont work correctly (in release mode only)
             QMAKE_CUFLAGS = $$replace(QMAKE_CUFLAGS, -Zc:inline, )
          
          	QMAKE_NVVFLAGS += -arch=$$CUDA_ARCH
          	QMAKE_NVVFLAGS += -rdc=true 
          	# -keep for holding intermediat files
          	QMAKE_CUEXTRAFLAGS += -Xcompiler $$join(QMAKE_CUFLAGS, ",")
             !contains(QMAKE_HOST.arch, x86_64) {
                ## Windows x86 (32bit) specific build here
                QMAKE_CUEXTRAFLAGS += --machine 32 --debug
             } else {
                ## Windows x64 (64bit) specific build here
                QMAKE_CUEXTRAFLAGS += --machine 64
             }	
             QMAKE_CUEXTRAFLAGS += $(DEFINES) $(INCPATH) $$join(QMAKE_COMPILER_DEFINES, " -D", -D)  -Xcompiler /Zc:__cplusplus
          
          	QMAKE_CUEXTRAFLAGS += -Xcudafe "--diag_suppress=field_without_dll_interface" 
          	QMAKE_CUEXTRAFLAGS += -Xcudafe "--diag_suppress=code_is_unreachable"
          	#-Xcudafe "--diag_suppress=boolean_controlling_expr_is_constant"
          
             CONFIG(debug, debug|release) {
                CUDA_OBJ_DIR = cuda/debug
             } else {
                CUDA_OBJ_DIR = cuda/release
             } 
             cu.dependency_type = TYPE_C 
          	cu.commands = \"$$QMAKE_CUC\" $$QMAKE_NVVFLAGS $$QMAKE_CUEXTRAFLAGS -c -o $${CUDA_OBJ_DIR}/$${QMAKE_CPP_MOD_CU}${QMAKE_FILE_BASE}$${QMAKE_EXT_OBJ} ${QMAKE_FILE_NAME}$$escape_expand(\\n\\t)
          	cu.output = $${CUDA_OBJ_DIR}/$${QMAKE_CPP_MOD_CU}${QMAKE_FILE_BASE}$${QMAKE_EXT_OBJ}
          	#silent:cu.commands = @echo nvcc ${QMAKE_FILE_IN} && $$cu.commands
          	cu.commands = @echo nvcc ${QMAKE_FILE_IN} && $$cu.commands
             cu.commands = $$replace(cu.commands,-D__cplusplus=199711L,)
          	QMAKE_EXTRA_COMPILERS += cu
          
          	build_pass|isEmpty(BUILDS):cuclean.depends = compiler_cu_clean
          	else:cuclean.CONFIG += recursive
          	QMAKE_EXTRA_TARGETS += cuclean
          
             # another compiler-entry for linking the device-code
          	device_link_target.target = $${CUDA_OBJ_DIR}/$${TARGET}_cu_device_link$${QMAKE_EXT_OBJ}
          	#device_link_target.CONFIG += no_check_exist executable
          	for(var, CUSOURCES) {
          	  var = $$basename(var)
          	  var = $$replace(var,"\\.cu",$${QMAKE_EXT_OBJ})
          	  CUDEP += $${CUDA_OBJ_DIR}/$${QMAKE_CPP_MOD_CU}$$var
          	}
          	var = $$basename(CUDEVLINK)
          	var = $$replace(var,"\\.cu",$${QMAKE_EXT_OBJ})
             CUDEVLINK_OBJ = $${CUDA_OBJ_DIR}/$${QMAKE_CPP_MOD_CU}$$var
          
          	cu_devlink.output = $${CUDA_OBJ_DIR}/$${TARGET}_cu_device_link$${QMAKE_EXT_OBJ}
          	cu_devlink.input = CUDEVLINK
          	cu_devlink.depends = $$CUDEP 
          	cu_devlink.dependency_type = TYPE_C 
          	cu_devlink.commands = @echo "link cuda device-code" && \"$$QMAKE_CUC\" -dlink -w -arch=$$CUDA_ARCH $$QMAKE_CUEXTRAFLAGS -o $$device_link_target.target $$CUDEP 
          	cu_devlink.name = cuda_devlink
          	cu_devlink.variable_out = OBJECTS
          	cu_devlink.CONFIG = silent
          	QMAKE_EXTRA_COMPILERS += cu_devlink
          
             QMAKE_PRE_LINK += $${cu_devlink.commands}
          }
          
          # add the cuda-libraries to the project
          LIBS += -L$$CUDA_LIB_PATH
          for(lnam, CUDA_LIBS) {
            LIBS+=$$join(lnam, " -l", -l)
          }
          
          
          T 1 Reply Last reply
          3
          • S Offline
            S Offline
            Sacha_D
            wrote on last edited by
            #5

            Thank you, Gerd I used your instructions and get this errors (I even try gcc & g++ 7.5.0. Before I used 8.3 with Cuda 10.2. Why it thinks that I use gcc version later than 8? How it was redefined? Ubuntu 18.04 LTS):

            <command-line>:0:0: warning: "__GNUC__" redefined
            <built-in>: note: this is the location of the previous definition
            <command-line>:0:0: warning: "__GNUC_MINOR__" redefined
            <built-in>: note: this is the location of the previous definition
            <command-line>:0:0: warning: "__GNUC_PATCHLEVEL__" redefined
            <built-in>: note: this is the location of the previous definition
            In file included from /usr/local/cuda/include/cuda_runtime.h:83:0,
                             from <command-line>:0:
            /usr/local/cuda/include/crt/host_config.h:138:2: error: #error -- unsupported GNU version! gcc versions later than 8 are not supported!
             #error -- unsupported GNU version! gcc versions later than 8 are not supported!
              ^~~~~
            <command-line>:0:0: warning: "__GNUC__" redefined
            <built-in>: note: this is the location of the previous definition
            <command-line>:0:0: warning: "__GNUC_MINOR__" redefined
            <built-in>: note: this is the location of the previous definition
            <command-line>:0:0: warning: "__GNUC_PATCHLEVEL__" redefined
            <built-in>: note: this is the location of the previous definition
            In file included from /usr/local/cuda/include/cuda_runtime.h:83:0,
                             from <command-line>:0:
            /usr/local/cuda/include/crt/host_config.h:138:2: error: #error -- unsupported GNU version! gcc versions later than 8 are not supported!
             #error -- unsupported GNU version! gcc versions later than 8 are not supported!
              ^~~~~
            g++ -c -pipe -fno-sized-deallocation -g -Wall -Wextra -D_REENTRANT -fPIC -DQT_DEPRECATED_WARNINGS -DQT_QML_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -I../src -I. -I/usr/local/cuda/include -I../../../Qt/5.14.0/gcc_64/include -I../../../Qt/5.14.0/gcc_64/include/QtWidgets -I../../../Qt/5.14.0/gcc_64/include/QtGui -I../../../Qt/5.14.0/gcc_64/include/QtCore -I. -isystem /usr/include/libdrm -I. -I../../../Qt/5.14.0/gcc_64/mkspecs/linux-g++ -o ../src/Obj/main.o ../src/main.cpp
            g++ -c -pipe -fno-sized-deallocation -g -Wall -Wextra -D_REENTRANT -fPIC -DQT_DEPRECATED_WARNINGS -DQT_QML_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB -I../src -I. -I/usr/local/cuda/include -I../../../Qt/5.14.0/gcc_64/include -I../../../Qt/5.14.0/gcc_64/include/QtWidgets -I../../../Qt/5.14.0/gcc_64/include/QtGui -I../../../Qt/5.14.0/gcc_64/include/QtCore -I. -isystem /usr/include/libdrm -I. -I../../../Qt/5.14.0/gcc_64/mkspecs/linux-g++ -o ../src/Obj/mainwindow.o ../src/mainwindow.cpp
            g++ -pipe -fno-sized-deallocation -g -Wall -Wextra -dM -E -o moc_predefs.h ../../../Qt/5.14.0/gcc_64/mkspecs/features/data/dummy.cpp
            /opt/Qt/5.14.0/gcc_64/bin/moc -DQT_DEPRECATED_WARNINGS -DQT_QML_DEBUG -DQT_WIDGETS_LIB -DQT_GUI_LIB -DQT_CORE_LIB --include /opt/cuda-qt/13-word-correction-fnn/bin/moc_predefs.h -I/opt/Qt/5.14.0/gcc_64/mkspecs/linux-g++ -I/opt/cuda-qt/13-word-correction-fnn/src -I/usr/local/cuda/include -I/opt/Qt/5.14.0/gcc_64/include -I/opt/Qt/5.14.0/gcc_64/include/QtWidgets -I/opt/Qt/5.14.0/gcc_64/include/QtGui -I/opt/Qt/5.14.0/gcc_64/include/QtCore -I. -I/usr/include/c++/9 -I/usr/include/x86_64-linux-gnu/c++/9 -I/usr/include/c++/9/backward -I/usr/lib/gcc/x86_64-linux-gnu/9/include -I/usr/local/include -I/usr/lib/gcc/x86_64-linux-gnu/9/include-fixed -I/usr/include/x86_64-linux-gnu -I/usr/include ../src/mainwindow.h -o moc_mainwindow.cpp
            <command-line>:0:0: warning: "__GNUC__" redefined
            <built-in>: note: this is the location of the previous definition
            <command-line>:0:0: warning: "__GNUC_MINOR__" redefined
            <built-in>: note: this is the location of the previous definition
            <command-line>:0:0: warning: "__GNUC_PATCHLEVEL__" redefined
            <built-in>: note: this is the location of the previous definition
            In file included from /usr/local/cuda/include/cuda_runtime.h:83:0,
                             from <command-line>:0:
            /usr/local/cuda/include/crt/host_config.h:138:2: error: #error -- unsupported GNU version! gcc versions later than 8 are not supported!
             #error -- unsupported GNU version! gcc versions later than 8 are not supported!
              ^~~~~
            Makefile:697: recipe for target 'cuda/debug/cu_word-correction-fnn-thrust.o' failed
            make: *** [cuda/debug/cu_word-correction-fnn-thrust.o] Error 1
            make: *** Waiting for unfinished jobs....
            Makefile:755: recipe for target 'cuda/debug/cu_word-correction-fnn-cuda.o' failed
            make: *** [cuda/debug/cu_word-correction-fnn-cuda.o] Error 1
            Makefile:812: recipe for target 'cuda/debug/cu_actfunc.o' failed
            make: *** [cuda/debug/cu_actfunc.o] Error 1
            In file included from ../src/word-correction-fnn-cuda.h:22:0,
                             from ../src/mainwindow.h:24,
                             from ../src/main.cpp:1:
            /usr/local/cuda/samples/common/inc/helper_cuda.h:223:20: warning: ‘const char* _cudaGetErrorEnum(curandStatus_t)’ defined but not used [-Wunused-function]
             static const char *_cudaGetErrorEnum(curandStatus_t error) {
                                ^~~~~~~~~~~~~~~~~
            In file included from ../src/word-correction-fnn-cuda.h:22:0,
                             from ../src/mainwindow.h:24,
                             from ../src/mainwindow.cpp:1:
            /usr/local/cuda/samples/common/inc/helper_cuda.h:223:20: warning: ‘const char* _cudaGetErrorEnum(curandStatus_t)’ defined but not used [-Wunused-function]
             static const char *_cudaGetErrorEnum(curandStatus_t error) {
                                ^~~~~~~~~~~~~~~~~
            
            1 Reply Last reply
            0
            • G Offline
              G Offline
              Gerd
              wrote on last edited by
              #6

              Hi,
              those defines find their way into this over the
              QMAKE_COMPILER_DEFINES
              macro i use in that file. Here the GNUC version should be detected by the toolchain you use, so you are shure you use GCC 8?
              Just add

              message("QMAKE_COMPILER_DEFINES = $$QMAKE_COMPILER_DEFINES")
              

              in the .pri file to see what this macro contains

              I think you can drop this from the file by changing

              QMAKE_CUEXTRAFLAGS += $(DEFINES) $(INCPATH) $$join(QMAKE_COMPILER_DEFINES, " -D", -D)  -Xcompiler /Zc:__cplusplus
              

              to

              QMAKE_CUEXTRAFLAGS += $(DEFINES) $(INCPATH) -Xcompiler /Zc:__cplusplus
              

              and then try again

              1 Reply Last reply
              0
              • S Offline
                S Offline
                Sacha_D
                wrote on last edited by
                #7

                @Gerd said in QtCreator. CUDA. Make final linking with NVCC:

                QMAKE_COMPILER_DEFINES

                Now I got this (warnings for all .cu files):

                nvcc ../src/word-correction-fnn-thrust.cu
                nvcc ../src/word-correction-fnn-cuda.cu
                nvcc ../src/actfunc.cu
                g++: warning: /tmp/tmpxft_000011d4_00000000-12_cu_word-correction-fnn-thrust_dlink.o: linker input file unused because linking not done
                g++: warning: /tmp/tmpxft_000011d4_00000000-10_word-correction-fnn-thrust.o: linker input file unused because linking not done
                g++: warning: /tmp/tmpxft_000011da_00000000-12_cu_actfunc_dlink.o: linker input file unused because linking not done
                g++: warning: /tmp/tmpxft_000011da_00000000-10_actfunc.o: linker input file unused because linking not done
                g++: warning: /tmp/tmpxft_000011d9_00000000-12_cu_word-correction-fnn-cuda_dlink.o: linker input file unused because linking not done
                g++: warning: /tmp/tmpxft_000011d9_00000000-10_word-correction-fnn-cuda.o: linker input file unused because linking not done
                link cuda device-code
                Makefile:265: recipe for target '13-word-correction-fnn' failed
                nvlink fatal   : Could not open input file 'cuda/debug/13-word-correction-fnn_cu_device_link.o'
                make: *** [13-word-correction-fnn] Error 1
                
                1 Reply Last reply
                0
                • G Offline
                  G Offline
                  Gerd
                  wrote on last edited by
                  #8

                  could you show your .pro-file please

                  S 1 Reply Last reply
                  0
                  • G Gerd

                    could you show your .pro-file please

                    S Offline
                    S Offline
                    Sacha_D
                    wrote on last edited by
                    #9

                    @Gerd
                    .pro file

                    #-------------------------------------------------
                    #
                    # Project created by QtCreator 2019-12-10T19:31:27
                    #
                    #-------------------------------------------------
                    
                    QT       += core gui
                    
                    greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
                    
                    TARGET = 13-word-correction-fnn
                    TEMPLATE = app
                    # The following define makes your compiler emit warnings if you use
                    # any feature of Qt which has been marked as deprecated (the exact warnings
                    # depend on your compiler). Please consult the documentation of the
                    # deprecated API in order to know how to port your code away from it.
                    DEFINES += QT_DEPRECATED_WARNINGS
                    
                    # You can also make your code fail to compile if you use deprecated APIs.
                    # In order to do so, uncomment the following line.
                    # You can also select to disable deprecated APIs only up to a certain version of Qt.
                    #DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0
                    
                    
                    CONFIG += c++11
                    
                    SOURCES += \
                            main.cpp \
                            mainwindow.cpp
                    
                    HEADERS += \
                            mainwindow.h \
                            word-correction-fnn-cuda.h \
                            actfunc.h
                    
                    FORMS += \
                            mainwindow.ui
                    
                    QMAKE_CXXFLAGS += "-fno-sized-deallocation"
                    
                    # Cuda sources
                    CUDA_SOURCES += word-correction-fnn-thrust.cu \
                                    word-correction-fnn-cuda.cu \
                                    actfunc.cu
                    # Project dir and outputs
                    PROJECT_DIR = $$system(pwd)
                    OBJECTS_DIR = $$PROJECT_DIR/Obj
                    DESTDIR = ../bin
                    include($$PWD/cuda.pri)
                    
                    

                    cuda.pri file

                    CUDA_BASE=$$quote($$clean_path($$(CUDA_PATH)))
                    isEmpty( CUDA_BASE ) {
                    	error("environment-variable CUDA_PATH is not defined!")
                    }
                    CUDA_BIN_PATH=$$CUDA_BASE/bin
                    CUDA_INC_PATH=$$CUDA_BASE/include
                    #CUDA_LIB_PATH=$$CUDA_BASE/lib
                    CUDA_LIB_PATH=$$CUDA_BASE/lib64
                    #!contains(QMAKE_HOST.arch, x86_64) {
                    #   CUDA_LIB_PATH=$$CUDA_LIB_PATH/win32
                    #} else {
                    #   CUDA_LIB_PATH=$$CUDA_LIB_PATH/x64
                    #}	
                    
                    # GPU architecture
                    CUDA_ARCH = sm_35
                    CUDA_VARCH = compute_35
                    
                    
                    # Add the necessary libraries
                    # CUDA < 9.0
                    #CUDA_LIBS=cudart_static nppi nppc 
                    # CUDA >= 10.0
                    CUDA_LIBS=cuda cudart_static nppc curand cudadevrt
                    
                    
                    # setting the CUdaCompiler
                    #QMAKE_CUC = $$CUDA_BIN_PATH/nvcc.exe
                    QMAKE_CUC = $$CUDA_BIN_PATH/nvcc
                    win32 {
                    	!exists($$QMAKE_CUC) {
                    		warning("can't find cuda compiler($$QMAKE_CUC)")
                    	}
                    	!exists($$CUDA_INC_PATH/cuda.h) {
                    		warning("can't find cuda include ($$CUDA_INC_PATH/cuda.h)")
                    	}
                    	!exists($$CUDA_LIB_PATH/cuda.lib) {
                    		warning("can't find cuda lib ($$CUDA_LIB_PATH/cuda.lib)")
                    	}
                    }
                    
                    # Cuda extra-compiler for handling files specified in the CUDA_SOURCES variable
                    {
                       cu.name = Cuda Sourcefiles
                    	cu.input = CUDA_SOURCES
                    	cu.dependency_type = TYPE_C
                    	cu.CONFIG += no_link
                    	cu.variable_out = OBJECTS
                    	isEmpty(QMAKE_CUC) {
                          win32:QMAKE_CUC = $$CUDA_BIN_PATH/nvcc.exe
                          else:QMAKE_CUC = nvcc
                    	}
                    
                    	isEmpty(CU_DIR):CU_DIR = .
                    	isEmpty(QMAKE_CPP_MOD_CU):QMAKE_CPP_MOD_CU = cu_
                    	isEmpty(QMAKE_EXT_CPP_CU):QMAKE_EXT_CPP_CU = .cu
                    	INCLUDEPATH += $$CUDA_INC_PATH
                    
                       CONFIG(debug, debug|release) {
                          QMAKE_CUFLAGS += $$QMAKE_CXXFLAGS $$QMAKE_CXXFLAGS_DEBUG $$QMAKE_CXXFLAGS_RTTI_ON $$QMAKE_CXXFLAGS_WARN_ON $$QMAKE_CXXFLAGS_STL_ON 
                    		QMAKE_NVVFLAGS += -G
                       } 	
                       CONFIG(release, debug|release) {
                          QMAKE_CUFLAGS += $$QMAKE_CXXFLAGS $$QMAKE_CXXFLAGS_RELEASE $$QMAKE_CXXFLAGS_RTTI_ON $$QMAKE_CXXFLAGS_WARN_ON $$QMAKE_CXXFLAGS_STL_ON 
                       } 	
                    	#since qt5.9 they use /Zc:rvalueCast- /Zc:inline- in the msvc-mkspecs
                    	# we have to switch that off!! 
                    	# else linking __device__ __managed__ vars wont work correctly (in release mode only)
                       QMAKE_CUFLAGS = $$replace(QMAKE_CUFLAGS, -Zc:inline, )
                    
                            QMAKE_NVVFLAGS += -gencode arch=$$CUDA_VARCH,code=$$CUDA_ARCH
                    	QMAKE_NVVFLAGS += -rdc=true 
                    	# -keep for holding intermediat files
                    	QMAKE_CUEXTRAFLAGS += -Xcompiler $$join(QMAKE_CUFLAGS, ",")
                       !contains(QMAKE_HOST.arch, x86_64) {
                          ## Windows x86 (32bit) specific build here
                          QMAKE_CUEXTRAFLAGS += --machine 32 --debug
                       } else {
                          ## Windows x64 (64bit) specific build here
                          QMAKE_CUEXTRAFLAGS += --machine 64
                       }	
                       #QMAKE_CUEXTRAFLAGS += $(DEFINES) $(INCPATH) $$join(QMAKE_COMPILER_DEFINES, " -D", -D)  -Xcompiler #/Zc:__cplusplus   this is for Windows
                       QMAKE_CUEXTRAFLAGS += $(DEFINES) $(INCPATH) -Xcompiler #/Zc:__cplusplus   this is for Windows
                    
                            #QMAKE_CUEXTRAFLAGS += -Xcudafe "--diag_suppress=field_without_dll_interface"      this is for Windows
                            #QMAKE_CUEXTRAFLAGS += -Xcudafe "--diag_suppress=code_is_unreachable"         this is for Windows
                    	#-Xcudafe "--diag_suppress=boolean_controlling_expr_is_constant"
                    
                       CONFIG(debug, debug|release) {
                          CUDA_OBJ_DIR = cuda/debug
                       } else {
                          CUDA_OBJ_DIR = cuda/release
                       } 
                       cu.dependency_type = TYPE_C 
                    	cu.commands = \"$$QMAKE_CUC\" $$QMAKE_NVVFLAGS $$QMAKE_CUEXTRAFLAGS -c -o $${CUDA_OBJ_DIR}/$${QMAKE_CPP_MOD_CU}${QMAKE_FILE_BASE}$${QMAKE_EXT_OBJ} ${QMAKE_FILE_NAME}$$escape_expand(\\n\\t)
                    	cu.output = $${CUDA_OBJ_DIR}/$${QMAKE_CPP_MOD_CU}${QMAKE_FILE_BASE}$${QMAKE_EXT_OBJ}
                    	#silent:cu.commands = @echo nvcc ${QMAKE_FILE_IN} && $$cu.commands
                    	cu.commands = @echo nvcc ${QMAKE_FILE_IN} && $$cu.commands
                       cu.commands = $$replace(cu.commands,-D__cplusplus=199711L,)
                    	QMAKE_EXTRA_COMPILERS += cu
                    
                    	build_pass|isEmpty(BUILDS):cuclean.depends = compiler_cu_clean
                    	else:cuclean.CONFIG += recursive
                    	QMAKE_EXTRA_TARGETS += cuclean
                    
                       # another compiler-entry for linking the device-code
                    	device_link_target.target = $${CUDA_OBJ_DIR}/$${TARGET}_cu_device_link$${QMAKE_EXT_OBJ}
                    	#device_link_target.CONFIG += no_check_exist executable
                    	for(var, CUDA_SOURCES) {
                    	  var = $$basename(var)
                    	  var = $$replace(var,"\\.cu",$${QMAKE_EXT_OBJ})
                    	  CUDEP += $${CUDA_OBJ_DIR}/$${QMAKE_CPP_MOD_CU}$$var
                    	}
                    	var = $$basename(CUDEVLINK)
                    	var = $$replace(var,"\\.cu",$${QMAKE_EXT_OBJ})
                       CUDEVLINK_OBJ = $${CUDA_OBJ_DIR}/$${QMAKE_CPP_MOD_CU}$$var
                    
                    	cu_devlink.output = $${CUDA_OBJ_DIR}/$${TARGET}_cu_device_link$${QMAKE_EXT_OBJ}
                    	cu_devlink.input = CUDEVLINK
                    	cu_devlink.depends = $$CUDEP 
                    	cu_devlink.dependency_type = TYPE_C 
                            cu_devlink.commands = @echo "link cuda device-code" && \"$$QMAKE_CUC\" -dlink -w -gencode arch=$$CUDA_VARCH,code=$$CUDA_ARCH $$QMAKE_CUEXTRAFLAGS -o $$device_link_target.target $$CUDEP
                    	cu_devlink.name = cuda_devlink
                    	cu_devlink.variable_out = OBJECTS
                    	cu_devlink.CONFIG = silent
                    	QMAKE_EXTRA_COMPILERS += cu_devlink
                    
                       QMAKE_PRE_LINK += $${cu_devlink.commands}
                    }
                    
                    # add the cuda-libraries to the project
                    LIBS += -L$$CUDA_LIB_PATH
                    for(lnam, CUDA_LIBS) {
                      LIBS+=$$join(lnam, " -l", -l)
                    }
                     
                    
                    
                    1 Reply Last reply
                    0
                    • G Offline
                      G Offline
                      Gerd
                      wrote on last edited by
                      #10

                      create an empty file file named "cu_devlink.cu" (or any other name) and put it in a node named "CUDEVLINK"

                      can't see this in your pro-file...

                      S 1 Reply Last reply
                      1
                      • G Gerd

                        create an empty file file named "cu_devlink.cu" (or any other name) and put it in a node named "CUDEVLINK"

                        can't see this in your pro-file...

                        S Offline
                        S Offline
                        Sacha_D
                        wrote on last edited by
                        #11

                        @Gerd I added. The error is the same.

                        #...
                        # Project dir and outputs
                        PROJECT_DIR = $$system(pwd)
                        OBJECTS_DIR = $$PROJECT_DIR/Obj
                        DESTDIR = ../bin
                        
                        CUDEVLINK = cu_devlink.cu
                        include($$PWD/cuda.pri)```
                        1 Reply Last reply
                        0
                        • SGaistS Offline
                          SGaistS Offline
                          SGaist
                          Lifetime Qt Champion
                          wrote on last edited by
                          #12

                          Shouldn't you use CUDA_SOURCES ?

                          Interested in AI ? www.idiap.ch
                          Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

                          1 Reply Last reply
                          0
                          • G Offline
                            G Offline
                            Gerd
                            wrote on last edited by
                            #13

                            change this line

                            QMAKE_CUEXTRAFLAGS += $(DEFINES) $(INCPATH) -Xcompiler #/Zc:__cplusplus   this is for Windows
                            

                            to

                            QMAKE_CUEXTRAFLAGS += $(DEFINES) $(INCPATH)
                            
                            S 1 Reply Last reply
                            2
                            • G Gerd

                              change this line

                              QMAKE_CUEXTRAFLAGS += $(DEFINES) $(INCPATH) -Xcompiler #/Zc:__cplusplus   this is for Windows
                              

                              to

                              QMAKE_CUEXTRAFLAGS += $(DEFINES) $(INCPATH)
                              
                              S Offline
                              S Offline
                              Sacha_D
                              wrote on last edited by
                              #14

                              @Gerd Thank you! It works! I also changed:

                              CUDA_LIBS=cuda cudart_static nppc curand cudadevrt
                              #to
                              CUDA_LIBS=cuda cudart nppc curand cudadevrt
                              
                              1 Reply Last reply
                              0
                              • G Offline
                                G Offline
                                Gerd
                                wrote on last edited by
                                #15

                                please set this thread to solved than...

                                S 1 Reply Last reply
                                0
                                • G Gerd

                                  please set this thread to solved than...

                                  S Offline
                                  S Offline
                                  Sacha_D
                                  wrote on last edited by
                                  #16

                                  @Gerd One more question: where I need to place

                                  | sed \"s/^.*: //\"
                                  

                                  to go to error line in .cu file by double clicking in QtCreactor.

                                  1 Reply Last reply
                                  0
                                  • G Offline
                                    G Offline
                                    Gerd
                                    wrote on last edited by
                                    #17

                                    in your first post this was appended to the "cuda_depend_command".
                                    In my solution i havent implemnted a "cu.depend_command". You can add this similar to that in your first post.

                                    1 Reply Last reply
                                    0
                                    • G Gerd

                                      Hi,
                                      you don't need to do the final link with nvcc, but relocatable cuda-code needs a link pass.
                                      I had the same problem some times ago, found a solution in the net and changed it to my needs.
                                      If you want to use this, you have to to the following steps:

                                      • save the code below as "cuda.pri"
                                      • remove all cuda related stuff from your pro-file
                                      • put the cuda sources in a node named "CUSOURCES"
                                      • create an empty file file named "cu_devlink.cu" (or any other name) and put it in a node named "CUDEVLINK"
                                      • include the cuda.pri file into your pro-file
                                      • add an evironment var named "CUDA_PATH" to your environmnet (or change the pri-file, whatever you like)
                                      • check all settings in the cuda.pri and make the changes you need before starting qmake!

                                      With this all cu-files will be compiled without linking, and as a prelink step all cuda files will be linked together in one obj file that is finally given, together with your other obj-files, to the standard linker.

                                      Gerd

                                      CUDA_BASE=$$quote($$clean_path($$(CUDA_PATH)))
                                      isEmpty( CUDA_BASE ) {
                                      	error("environment-variable CUDA_PATH is not defined!")
                                      }
                                      CUDA_BIN_PATH=$$CUDA_BASE/bin
                                      CUDA_INC_PATH=$$CUDA_BASE/include
                                      CUDA_LIB_PATH=$$CUDA_BASE/lib
                                      !contains(QMAKE_HOST.arch, x86_64) {
                                         CUDA_LIB_PATH=$$CUDA_LIB_PATH/win32
                                      } else {
                                         CUDA_LIB_PATH=$$CUDA_LIB_PATH/x64
                                      }	
                                      
                                      # GPU architecture
                                      CUDA_ARCH = sm_52
                                      
                                      # Add the necessary libraries
                                      # CUDA < 9.0
                                      #CUDA_LIBS=cudart_static nppi nppc 
                                      # CUDA >= 10.0
                                      CUDA_LIBS=cuda cudart_static nppc curand cudadevrt
                                      
                                      
                                      # setting the CUdaCompiler
                                      QMAKE_CUC = $$CUDA_BIN_PATH/nvcc.exe
                                      win32 {
                                      	!exists($$QMAKE_CUC) {
                                      		warning("can't find cuda compiler($$QMAKE_CUC)")
                                      	}
                                      	!exists($$CUDA_INC_PATH/cuda.h) {
                                      		warning("can't find cuda include ($$CUDA_INC_PATH/cuda.h)")
                                      	}
                                      	!exists($$CUDA_LIB_PATH/cuda.lib) {
                                      		warning("can't find cuda lib ($$CUDA_LIB_PATH/cuda.lib)")
                                      	}
                                      }
                                      
                                      # Cuda extra-compiler for handling files specified in the CUSOURCES variable
                                      {
                                         cu.name = Cuda Sourcefiles
                                      	cu.input = CUSOURCES
                                      	cu.dependency_type = TYPE_C
                                      	cu.CONFIG += no_link
                                      	cu.variable_out = OBJECTS
                                      	isEmpty(QMAKE_CUC) {
                                            win32:QMAKE_CUC = $$CUDA_BIN_PATH/nvcc.exe
                                            else:QMAKE_CUC = nvcc
                                      	}
                                      
                                      	isEmpty(CU_DIR):CU_DIR = .
                                      	isEmpty(QMAKE_CPP_MOD_CU):QMAKE_CPP_MOD_CU = cu_
                                      	isEmpty(QMAKE_EXT_CPP_CU):QMAKE_EXT_CPP_CU = .cu
                                      	INCLUDEPATH += $$CUDA_INC_PATH
                                      
                                         CONFIG(debug, debug|release) {
                                            QMAKE_CUFLAGS += $$QMAKE_CXXFLAGS $$QMAKE_CXXFLAGS_DEBUG $$QMAKE_CXXFLAGS_RTTI_ON $$QMAKE_CXXFLAGS_WARN_ON $$QMAKE_CXXFLAGS_STL_ON 
                                      		QMAKE_NVVFLAGS += -G
                                         } 	
                                         CONFIG(release, debug|release) {
                                            QMAKE_CUFLAGS += $$QMAKE_CXXFLAGS $$QMAKE_CXXFLAGS_RELEASE $$QMAKE_CXXFLAGS_RTTI_ON $$QMAKE_CXXFLAGS_WARN_ON $$QMAKE_CXXFLAGS_STL_ON 
                                         } 	
                                      	#since qt5.9 they use /Zc:rvalueCast- /Zc:inline- in the msvc-mkspecs
                                      	# we have to switch that off!! 
                                      	# else linking __device__ __managed__ vars wont work correctly (in release mode only)
                                         QMAKE_CUFLAGS = $$replace(QMAKE_CUFLAGS, -Zc:inline, )
                                      
                                      	QMAKE_NVVFLAGS += -arch=$$CUDA_ARCH
                                      	QMAKE_NVVFLAGS += -rdc=true 
                                      	# -keep for holding intermediat files
                                      	QMAKE_CUEXTRAFLAGS += -Xcompiler $$join(QMAKE_CUFLAGS, ",")
                                         !contains(QMAKE_HOST.arch, x86_64) {
                                            ## Windows x86 (32bit) specific build here
                                            QMAKE_CUEXTRAFLAGS += --machine 32 --debug
                                         } else {
                                            ## Windows x64 (64bit) specific build here
                                            QMAKE_CUEXTRAFLAGS += --machine 64
                                         }	
                                         QMAKE_CUEXTRAFLAGS += $(DEFINES) $(INCPATH) $$join(QMAKE_COMPILER_DEFINES, " -D", -D)  -Xcompiler /Zc:__cplusplus
                                      
                                      	QMAKE_CUEXTRAFLAGS += -Xcudafe "--diag_suppress=field_without_dll_interface" 
                                      	QMAKE_CUEXTRAFLAGS += -Xcudafe "--diag_suppress=code_is_unreachable"
                                      	#-Xcudafe "--diag_suppress=boolean_controlling_expr_is_constant"
                                      
                                         CONFIG(debug, debug|release) {
                                            CUDA_OBJ_DIR = cuda/debug
                                         } else {
                                            CUDA_OBJ_DIR = cuda/release
                                         } 
                                         cu.dependency_type = TYPE_C 
                                      	cu.commands = \"$$QMAKE_CUC\" $$QMAKE_NVVFLAGS $$QMAKE_CUEXTRAFLAGS -c -o $${CUDA_OBJ_DIR}/$${QMAKE_CPP_MOD_CU}${QMAKE_FILE_BASE}$${QMAKE_EXT_OBJ} ${QMAKE_FILE_NAME}$$escape_expand(\\n\\t)
                                      	cu.output = $${CUDA_OBJ_DIR}/$${QMAKE_CPP_MOD_CU}${QMAKE_FILE_BASE}$${QMAKE_EXT_OBJ}
                                      	#silent:cu.commands = @echo nvcc ${QMAKE_FILE_IN} && $$cu.commands
                                      	cu.commands = @echo nvcc ${QMAKE_FILE_IN} && $$cu.commands
                                         cu.commands = $$replace(cu.commands,-D__cplusplus=199711L,)
                                      	QMAKE_EXTRA_COMPILERS += cu
                                      
                                      	build_pass|isEmpty(BUILDS):cuclean.depends = compiler_cu_clean
                                      	else:cuclean.CONFIG += recursive
                                      	QMAKE_EXTRA_TARGETS += cuclean
                                      
                                         # another compiler-entry for linking the device-code
                                      	device_link_target.target = $${CUDA_OBJ_DIR}/$${TARGET}_cu_device_link$${QMAKE_EXT_OBJ}
                                      	#device_link_target.CONFIG += no_check_exist executable
                                      	for(var, CUSOURCES) {
                                      	  var = $$basename(var)
                                      	  var = $$replace(var,"\\.cu",$${QMAKE_EXT_OBJ})
                                      	  CUDEP += $${CUDA_OBJ_DIR}/$${QMAKE_CPP_MOD_CU}$$var
                                      	}
                                      	var = $$basename(CUDEVLINK)
                                      	var = $$replace(var,"\\.cu",$${QMAKE_EXT_OBJ})
                                         CUDEVLINK_OBJ = $${CUDA_OBJ_DIR}/$${QMAKE_CPP_MOD_CU}$$var
                                      
                                      	cu_devlink.output = $${CUDA_OBJ_DIR}/$${TARGET}_cu_device_link$${QMAKE_EXT_OBJ}
                                      	cu_devlink.input = CUDEVLINK
                                      	cu_devlink.depends = $$CUDEP 
                                      	cu_devlink.dependency_type = TYPE_C 
                                      	cu_devlink.commands = @echo "link cuda device-code" && \"$$QMAKE_CUC\" -dlink -w -arch=$$CUDA_ARCH $$QMAKE_CUEXTRAFLAGS -o $$device_link_target.target $$CUDEP 
                                      	cu_devlink.name = cuda_devlink
                                      	cu_devlink.variable_out = OBJECTS
                                      	cu_devlink.CONFIG = silent
                                      	QMAKE_EXTRA_COMPILERS += cu_devlink
                                      
                                         QMAKE_PRE_LINK += $${cu_devlink.commands}
                                      }
                                      
                                      # add the cuda-libraries to the project
                                      LIBS += -L$$CUDA_LIB_PATH
                                      for(lnam, CUDA_LIBS) {
                                        LIBS+=$$join(lnam, " -l", -l)
                                      }
                                      
                                      
                                      T Offline
                                      T Offline
                                      tehfury87
                                      wrote on last edited by
                                      #18

                                      @Gerd Thank you for these build instructions! Though I only found this post AFTER figuring out the problem. My CUDA code stopped working after upgrading Qt and some other libraries. I was getting invalid symbol and invalid texture errors at runtime, not linking errors. So it took days to track this down. How did you find this?

                                      	#since qt5.9 they use /Zc:rvalueCast- /Zc:inline- in the msvc-mkspecs
                                      	# we have to switch that off!! 
                                      	# else linking __device__ __managed__ vars wont work correctly (in release mode only)
                                         QMAKE_CUFLAGS = $$replace(QMAKE_CUFLAGS, -Zc:inline, )
                                      

                                      Do you think it makes sense to report this change as a bug in qmake? It's easy to work around and I doubt they'd revert it, but it's a frustrating invisible change that breaks things.

                                      Here is the change that broke it:
                                      https://code.qt.io/cgit/qt/qtbase.git/commit/mkspecs/common/msvc-version.conf?h=5.9&id=255d291efd5ed3e193a6340055c35887f687f0ca

                                      To fix the problem and make the build consistent between Qt 5.8 and newer, I added this to my general configuration:

                                      equals(QT_MAJOR_VERSION, 5):lessThan(QT_MINOR_VERSION, 9):*msvc* {
                                        QMAKE_CXXFLAGS += -Zc:rvalueCast
                                        QMAKE_CXXFLAGS += -Zc:referenceBinding
                                        # Need to unset this for CUDA code
                                        QMAKE_CXXFLAGS += -Zc:inline
                                      }
                                      

                                      and this to just the library that uses CUDA:

                                      *msvc* {
                                        # Fix symbols and textures removed from library
                                        # https://forum.qt.io/post/584959
                                        QMAKE_CXXFLAGS -= -Zc:inline
                                        QMAKE_CXXFLAGS += -Zc:inline-
                                      }
                                      
                                      1 Reply Last reply
                                      0
                                      • Pl45m4P Pl45m4 referenced this topic on

                                      • Login

                                      • Login or register to search.
                                      • First post
                                        Last post
                                      0
                                      • Categories
                                      • Recent
                                      • Tags
                                      • Popular
                                      • Users
                                      • Groups
                                      • Search
                                      • Get Qt Extensions
                                      • Unsolved