8

コンパイラ/リンカのエラーが発生しましたが、続行するための正しい方法がわかりません。私はこの状況にあります:

  • ah:このファイルでは、「インライン」として宣言された関数が定義されています。例:inline void foo1();
  • bh:このファイルでは、foo1()を呼び出す「インライン」として宣言された関数が定義されています。inlinevoid foo2();
  • main.c:foo1とfoo2()の両方の関数呼び出しがいくつかあります。

ここで、ahとbhのfoo1とfoo2をextern inline voidとして宣言すると、次のエラーが発生します。

prj / src / bo:関数foo1': (.text+0x0): multiple definition offoo1'でprj/ src / main.o:(。text + 0x0):ここで最初に定義されたmake:* [kernel]エラー1

私が説明した状況でエラー/警告なしにコンパイルおよびリンクできるようにする方法は何ですか?

4

4 に答える 4

21

http://gcc.gnu.org/onlinedocs/gcc/Inline.htmlから:

インライン関数が静的でない場合、コンパイラは他のソースファイルからの呼び出しがある可能性があると想定する必要があります。グローバルシンボルはどのプログラムでも一度しか定義できないため、他のソースファイルで関数を定義してはならず、その中の呼び出しを統合することはできません。したがって、非静的インライン関数は常に通常の方法でそれ自体でコンパイルされます。

つまり、がないstaticと、インライン関数のシンボルが出力されます。その関数をヘッダーで定義し、それを複数のコンパイルユニットに含めると、複数の(再定義された)シンボルになってしまいます。ヘッダーに定義を含めたい場合は、それを作成する必要がありますstatic

于 2013-02-21T23:11:51.613 に答える
0

inline定義を.hファイルに入れ、.cファイルに外部定義を強制します。

例えば:

// File: a.h
inline void foo1(void) { /*...*/ }

// File main.c
#include "a.h"

extern inline void foo1(void);

int main(void)
{
    /*...*/   
}
于 2013-02-21T22:54:15.890 に答える
0

試してみましたが、エラーは発生しませんでした

ああ

extern inline void foo1()
{
    return;
}

bh

extern inline void foo2()
{
    foo1();
    return;
}

main.cpp

#include "a.h"
#include "b.h"

int main() {
    foo1();
    foo2();
    return 0;
}
于 2013-02-21T22:56:58.187 に答える
0

再定義を防ぐためにヘッダーガードの使用を検討することができます。ファイルの実装は次のとおりです。CMakeを使用して次のファイルのコンパイルを試みましたが、問題なく動作しました。

a.h

#ifndef A_H
#define A_H

inline
void foo1()
{
    return;
}

#endif

b.h

#ifndef B_H
#define B_H

#include "a.h"

inline
void foo2()
{
    foo1();
    return;
}

#endif

main.cpp

#include "a.h"
#include "b.h"

int main() {
    foo1();
    foo2();
    return 0;
}
于 2020-02-06T04:19:51.090 に答える