【发布时间】:2017-07-27 04:07:37
【问题描述】:
基本上我的问题是这样的:
我有一个头文件 - foo.h,其中有一个结构指针 human *person = NULL。结构 human 的定义位于 foo.h 中包含的另一个标头中。我正在使用foo.h 和其他一些标头和cpps 创建一个共享对象文件game.so。
现在,我有两个不同的 cpp 文件 - a.cpp 和 b.cpp,其中包括头文件 foo.h。
我正在分别创建一个对象文件a.o 和b.o。
我正在链接对象文件和game.so 以创建另一个共享对象文件tennis.so,在这样做的同时,我得到了“人”的多个定义。我知道多重定义错误是因为 a.o 包含 person 的结构定义,b.o 也是如此。
我已经在foo.h 中使用了#pragma once。 a.o 正在单独编译,b.o 正在单独编译。所以我不认为#pragma once 或 ifdef 在这里会有用,因为 a.cpp 和 b.cpp 都包括 foo.h
由于在创建 game.so 时存在一些依赖关系,我无法将 foo.h 中的结构定义更改为任何其他 cpp 文件
有没有其他方法可以解决我在创建tennis.so 时遇到的多重定义错误?
【问题讨论】:
-
结构体不存在多定义链接错误。请发布准确的代码和构建命令以重现这种情况,以及准确的编译器输出。
-
我无法发布确切的代码,因为它很少保密。还有什么我可以做的吗?
-
您可以创建一个 MCVE (minimal reproducible example)。这将重现问题,但不包含任何机密信息。听起来您的标头没有声明变量;它定义了变量。因此,每个包含标题的文件都包含一个定义,从而防止它们链接在一起。简单的经验法则:在标头中声明的变量应使用关键字
extern声明。 -
@M.M 我稍微修改了这个问题。现在请看一下,看看你能不能帮到我。
-
@JonathanLeffler 它是一个结构指针 Joanathan 。
标签: c++ c object linker shared