我将C++代码转换为C,现在我也在尝试更改Makefile。我有这样的经历:
g++ -fPIC -o bin/linux/release/gpu_md5 cuda_md5.c cuda_md5_cpu.c obj/release/cuda_md5_gpu.cu.o
-L/usr/local/cuda/lib64 -L../../lib64
-L../../common/lib64/linux -L/opt/cuda/NVIDIA_CUDA_SDK/lib64 -lcudart
-L/usr/local/cuda/lib64 -L../../lib64
-L../../common/lib64/linux -L/opt/cuda/NVIDIA_CUDA_SDK/lib64据我所知,我可以将g++更改为gcc,它应该可以很好地工作,但事实并非如此。看起来gcc找不到我在cuda_md5.c中调用的来自cuda_md5_cpu.c的函数(PS:我没有在cuda_md5.c中包含cuda_md5_cpu.c ):
/tmp/ccKdDJiq.o: In function `cuda_compute_md5s':
cuda_md5.c:(.text+0x201): undefined reference to `init_constants'
cuda_md5.c:(.text+0x2e2): undefined reference to `execute_kernel'
collect2: ld returned 1 exit status怎么啦?我刚从g++换成了gcc。
发布于 2012-10-14 13:33:09
我想说的是,obj/release/cuda_md5_gpu.cu.o (您似乎没有重新编译它)很有可能是用C++编译器编译的,因此它的符号名称已被名称损坏所修改。
名称重写是C++编译器使用的一种技术,它允许不同的函数具有相同的名称但具有不同的参数类型(重载),而C编译器不需要这样做,因为不允许重载。
换句话说,您可能会发现init_constants(int,float);可能只是被C编译器转换为_init_constants,但是,如果您使用C++编译器,您将得到类似_init_constants_$$_IntFloat的代码,以便将其与init_constants(int,double)或init_constants(void)区分开来。
因此,试图将C编译的cuda_md5.c与C++编译的obj/release/cuda_md5_gpu.cu.o链接在一起的链接器将无法将函数名匹配在一起。
这就是您经常在C++代码中看到extern "C" { ... }的原因,它使用C规则将函数名(和其他内容)导出到链接器,以便将C和C++代码链接在一起。
https://stackoverflow.com/questions/12879562
复制相似问题