0

多分私はまだベッドにいるはずです。プログラミングしたくて目が覚めました。とにかく、今私は困惑しているいくつかのリンカーエラーを受け取っています。あなたはこれをどう思いますか?あまり投稿しないといいのですが。作品だけを投稿するつもりでしたが、それは正しくありませんでした。エラーに記載されているヘッダーファイルのいくつかを確認しましたが、Splitはどこにも表示されませんでした。奇妙なことに、splitという名前で始まりましたが、これと同様のエラーが発生しました。

/home/starlon/Projects/LCDControl/WidgetIcon.h:59: multiple definition of `LCD::Split(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, char)'
LCDControl.o:/home/starlon/Projects/LCDControl/WidgetIcon.h:59: first defined here
QtDisplay.o: In function `LCD::Split(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, char)':
/usr/lib/gcc/i586-redhat-linux/4.4.1/../../../../include/c++/4.4.1/new:101: multiple definition of `LCD::Split(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, char)'
LCDControl.o:/home/starlon/Projects/LCDControl/WidgetIcon.h:59: first defined here
DrvQt.o: In function `LCD::Split(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, char)':
/usr/lib/gcc/i586-redhat-linux/4.4.1/../../../../include/c++/4.4.1/bits/stl_deque.h:79: multiple definition of `LCD::Split(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, char)'
LCDControl.o:/home/starlon/Projects/LCDControl/WidgetIcon.h:59: first defined here
LCDText.o: In function `LCD::Split(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, char)':
/usr/lib/gcc/i586-redhat-linux/4.4.1/../../../../include/c++/4.4.1/new:101: multiple definition of `LCD::Split(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, char)'
LCDControl.o:/home/starlon/Projects/LCDControl/WidgetIcon.h:59: first defined here
Property.o: In function `LCD::Split(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, char)':
/usr/include/QtCore/qatomic_i386.h:125: multiple definition of `LCD::Split(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, char)'
LCDControl.o:/home/starlon/Projects/LCDControl/WidgetIcon.h:59: first defined here
moc_QtDisplay.o: In function `LCD::Split(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, char)':
/home/starlon/Projects/LCDControl/WidgetIcon.h:59: multiple definition of `LCD::Split(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, char)'
LCDControl.o:/home/starlon/Projects/LCDControl/WidgetIcon.h:59: first defined here

分割は次のとおりです。

std::vector<std::string> Split(const std::string &s, char delim) {
    std::vector<std::string> elems;
    return elems; //Split(s, delim, elems);
}
4

2 に答える 2

4

このような複数の定義エラーの通常の原因は、inlineキーワードを使用せずにヘッダーファイルで関数を定義する場合です。また、投稿したSplit関数がLCDクラスのものである場合、署名にはそのLCD::部分がありません。

于 2009-10-21T10:21:40.033 に答える
2

複数のオブジェクトファイルがの実装を提供していますLCD::Split。これは、定義がヘッダーファイルにあるためです。

関数をインライン化または静的にすると、関数を使用する各オブジェクトファイルの可視性が制限され、衝突が防止されます。ただし、これは、使用されている場合、すべてのオブジェクトファイルにその関数の実装が含まれることを意味します。さらに、インライン化により、すべてのコールサイトで生成されるバイナリの量が増加します。関数を静的にすると、オブジェクトファイルごとにLCD::Splitのコピーが1つ作成されます。

最善の解決策は、の実装をLCD::Split独自のソースファイルに配置して、コンパイル後に実装が単一のオブジェクトファイルに存在するようにすることです。

#pragma onceさらに、複数の宣言のコンパイル時の競合を防ぐために、ヘッダーに、などのインクルードガードが含まれていることを確認することもできます。

于 2009-10-21T10:56:02.313 に答える