(.bss+0x0):代理的多重定义

(.bss+0x0): multiple definition of Proxies

本文关键字:定义 代理 bss+0x0      更新时间:2023-10-16

我有这段代码用于自动化机器人。它使用了一些来自Player的代理类,Player是一款用于编程机器人的开源软件。我使用以下命令编译了两个cpp文件:

g++-c-Wall navigation.cpp`pkg配置--cflags playerc++`pkg配置--libs playerc++`和g++-c-Wall autonavigation.cpp`pkg配置--cflags playerc++`pkg配置--libs playerc++`然后我链接了对象文件(这就是出现问题的地方):g++-o自动导航.o自动导航.o`pkg配置--cflags playerc++`pkg配置--libs playerc++`

代码在这里:

erratic@erratic-desktop:~/桌面/autonav$g++-o自动导航。oautonavigation.o`pkg配置--cflags playerc++`pkg配置--libs playerc++`autonavigation.o:(.bss+0x0):"gHostname"的多重定义navigation.o:(.bss+0x0):首先在此处定义autonavigation.o:(.data+0x0):"gPort"的多重定义navigation.o:(.data+0x0):首先在此处定义autonavigation.o:(.bss+0x4):"gIndex"的多重定义navigation.o:(.bss+0x4):首先在此处定义autonavigation.o:(.bss+0x8):"gDebug"的多重定义navigation.o:(.bss+0x8):首先在此处定义autonavigation.o:(.data+0x4):"gFrequency"的多重定义navigation.o:(.data+0x4):首先在此处定义autonavigation.o:(.data+0x8):"gDataMode"的多重定义navigation.o:(.data+0x8):首先在此处定义autonavigation.o:(.bss+0xc):"gUseLaser"的多重定义navigation.o:(.bss+0xc):首先在此处定义autonavigation.o:在函数"parse_args(int,char**)"中:autonavigation.cpp:(.text+0x0):"parse_args(int,char**)"的多重定义navigation.o:navigation.cpp:(.text+0x0):首先在此处定义autonavigation.o:在函数"print_usage(int,char**)"中:autonavigation.cpp:(.text+0x101):"print_usage(int,char**)"的多重定义navigation.o:navigation.cpp:(.text+0x101):在此处首次定义collect2:ld返回1退出状态

来自注释的源代码:

//navigation.h
#include <libplayerc++/playerc++.h>
#include <stdio.h>
#include <time.h>
#include "args.h"
#define PI 3.14159
using namespace std;
using namespace PlayerCc;
class navigation
{
public:
navigation();
void autoNavigate(PlayerClient &, LaserProxy &, Position2dProxy &, PtzProxy &, IrProxy &, SonarProxy &);
private:
void wallFollow(LaserProxy &, Position2dProxy &);
void obstacleAvoid(IrProxy &, SonarProxy &, PlayerClient &, Position2dProxy &);
};

autonavigation.cpp:的来源

#include "navigation.h"
int main(int argc, char *argv[])
{
PlayerClient robot("localhost");
LaserProxy lp(&robot,0);
Position2dProxy pp(&robot,0);
PtzProxy ptp (&robot,0);
IrProxy ir(&robot,0);
SonarProxy sp(&robot, gIndex);
navigation nav;
nav.autoNavigate(robot, lp, pp, ptp, ir, sp);
}

在没有看到您的代码的情况下,我们只能猜测,但我的猜测是,您在两个源文件中都包含的头文件中定义这些变量。

您应该声明变量,并使用extern告诉编译器变量是在其他地方定义的。然后在一个源文件中定义变量(即与头文件中的声明相同,但没有extern关键字)。

例如,假设我有一个变量hostname,我想在多个源文件中使用它,然后我在一个头文件中声明extern,包括在所有需要该变量的源文件中:

extern char hostname[32];

然后在一个源文件中,我定义了变量:

char hostname[32];