首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >g++的不同链接方式-- gcc

g++的不同链接方式-- gcc
EN

Stack Overflow用户
提问于 2012-10-14 13:29:00
回答 1查看 99关注 0票数 1

我将C++代码转换为C,现在我也在尝试更改Makefile。我有这样的经历:

代码语言:javascript
复制
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 ):

代码语言:javascript
复制
/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。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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++代码链接在一起。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12879562

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档