gpt4 book ai didi

c++ - 具有多个 .h 和 .cu 文件的静态库无法解析函数

转载 作者:行者123 更新时间:2023-11-30 01:24:26 26 4
gpt4 key购买 nike

使用多个 .h 和 .cu 文件编译静态库时,我得到一个未解析的外部函数。这是一个复制错误的简短示例。

看来我无法先获取 Nsight Eclipse Edition 来编译 extrafunctions.cu。在我的完整项目中,带有额外函数的文件首先被编译,但它仍然抛出无法解析外部函数的错误。

这是此示例的输出:

**** Build of configuration Debug for project linkerror ****

make all
Building file: ../cudatest.cu
Invoking: NVCC Compiler
nvcc -I/usr/local/cuda/include -G -g -O0 -gencode arch=compute_30,code=sm_30 -odir "" -M -o "cudatest.d" "../cudatest.cu"
nvcc --compile -G -I/usr/local/cuda/include -O0 -g -gencode arch=compute_30,code=compute_30 -gencode arch=compute_30,code=sm_30 -x cu -o "cudatest.o" "../cudatest.cu"
../cudatest.cu(19): warning: variable "devInts" is used before its value is set

../cudatest.cu(19): warning: variable "devInts" is used before its value is set

ptxas fatal : Unresolved extern function '_Z9incrementi'
make: *** [cudatest.o] Error 255

**** Build Finished ****

cudatest.h:

#ifndef CUDAPATH_H_
#define CUDAPATH_H_

#include <cuda.h>
#include <cuda_runtime.h>
#include "extrafunctions.h"

void test();


#endif /* CUDAPATH_H_ */

cudatest.cu:

#include <cuda.h>
#include <cuda_runtime.h>
#include "extrafunctions.h"

__global__ void kernel(int* devInts){
int tid = threadIdx.x + (blockDim.x*blockIdx.x);

if (tid == 0){
for(int i = 0; i < NUMINTS; i++){
devInts[i] = increment(devInts[i]);
}
}
}

void test(){

int* myInts = (int*)malloc(NUMINTS * sizeof(int));
int* devInts;
cudaMemcpy((void**)devInts, myInts, NUMINTS*sizeof(int), cudaMemcpyHostToDevice);
kernel<<<1,1>>>(devInts);
int* outInts = (int*)malloc(NUMINTS * sizeof(int));
cudaFree(devInts);
free(myInts);
free(outInts);
}

extrafunctions.h:

#ifndef EXTRAFUNCTIONS_H_
#define EXTRAFUNCTIONS_H_

#include <cuda.h>
#include <cuda_runtime.h>

#define NUMINTS 4

int __device__ increment(int i);

#endif /* EXTRAFUNCTIONS_H_ */

extrafunctions.cu:

#include <cuda.h>
#include <cuda_runtime.h>
#include "extrafunctions.h"


int __device__ increment(int i){
return i+1;
}

最佳答案

您需要显式启用单独编译才能工作。右键单击您的项目,“属性”,Build->CUDA 并选择“单独编译”链接器模式。

请注意,单独编译仅适用于 SM 2.0+ GPU,并且只能发出 SASS(例如,不可能发出与 future CUDA 设备兼容的 PTX)。更多信息请阅读 NVCC manual 中的“在 CUDA 中使用单独编译” .

更新您需要使用 NVCC 链接器来链接设备代码,这就是 GCC 链接器失败的原因。在 Nsight 中,您可以使用 NVCC 链接整个应用程序,或者设置一个包含所有 CUDA 代码并使用 NVCC 收费链构建的静态库项目,以及一个使用 GCC 并与第一个项目生成的静态库链接的常规 C/C++ 项目。

关于c++ - 具有多个 .h 和 .cu 文件的静态库无法解析函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13632180/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com