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
Qt 6.11 is out! See what's new in the release blog

QtCreator. CUDA. Make final linking with NVCC

Scheduled Pinned Locked Moved Solved General and Desktop
18 Posts 4 Posters 9.7k 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
    #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