4

ロボットを自動化するためのこのコードがあります。ロボットをプログラミングするためのオープンソース ソフトウェアである Player のいくつかのプロキシ クラスを使用します。次のコマンドを使用して、2 つの 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 autonavigate 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、変数が別の場所で定義されていることをコンパイラに伝えるために使用する必要があります。次に、1 つのソース ファイルで変数を定義します (つまり、ヘッダー ファイルの宣言と同じですが、externキーワードはありません)。

たとえばhostname、複数のソース ファイルで使用したい変数があるとします。次にextern、変数を必要とするすべてのソース ファイルに含めるヘッダー ファイルで宣言を行います。

extern char hostname[32];

次に、1 つのソース ファイルで変数を定義します。

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