Linux解决multiple Definition的链接错误

当我们在跨平台开发的时候,windows上的版本通常使用visual studio 进行编译,但是到了linux环境下却发现会出现multiple-definition的问题。

先分析下从源码编译到可执行文件的过程:

  1. 预处理将伪指令(宏定义、条件编译、引用头文件)特殊符号进行处理
  2. 编译过程通过词法分析、语法分析生成汇编代码,此步还会进行优化
  3. 汇编过程将汇编代码翻译为目标机器指令的过程(.o 文件 包含代码段和数据段)
  4. 链接程序将所有需要用到的目标代码(变量函数、其他库文件)装配到一个整体(可分为静态链接和动态链接)

前三个步骤为编译过程,第四个为链接过程

我们这个链接失败的原因就是,C语言规定 一个变量可以多次声明但只能定义一次,所以每个头文件需要加宏定义的条件编译,但c++中链接错误同样会发生 原因为ifndef 作用域仅在单个文件,所以还是会出现重复定义的错误。
在Windows环境中,链接器-》命令行-》添加/force 即可。

在Linux环境中,最简单的解决方法就是编译命令加上以下

1
-Wl,--allow-multiple-definition

Example:

1
g++ -fopenmp -o Multiblock3d testSinglePhaseRender.o simpleBlock3d.o string_extra.o propagate.o Ocblock.o objLoader.o obj_parser.o mlStreamGpu.o mlCuRunTime.o mlCollideGpu.o mlCalMacroGpu.o mlBndConditionGpu.o list.o geometry3D.o colorramp.o -lcudart -L/usr/local/cuda/lib64 -Wl,--allow-multiple-definition

原文地址:https://www.cnblogs.com/edwardcmh/archive/2013/06/09/3129364.html