4

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

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

代码在这里:

erratic@erratic-desktop:~/Desktop/autonav$ g++ -o autonavigate navigation.o
autonavigation.o `pkg-config --cflags playerc++` `pkg-config --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);
}
4

1 回答 1

5

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

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

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

extern char hostname[32];

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

char hostname[32];
于 2012-09-20T11:06:02.470 回答