ヘッダファイルの外側にメンバ関数を定義する時のinline指定について
main.cpp、DUT.cppを分割コンパイルした場合、リンク時に
main.o(.text+0x0): In function `DUT::FuncA()':
<省略>/DUT.h:12: multiple definition of `DUT::FuncA()'
DUT.o(.text+0x0):<省略>/DUT.h:12: first defined here
collect2: ld returned 1 exit status
とエラーが出ます。FuncA関数をインライン指定するとリンクエラーはなくなります。
インライン指定しないと関数の実体がDUT.cpp/main.cppコンパイル毎に生成され、リンク時に衝突してしまう感覚はなんとなくわかるのですが、インライン指定時にFuncA関数の中身はどこに存在しているのでしょうか。
nm/objdumpで見ても見つかりません。
どういうメモリ構造故、インライン指定時には問題が起きていないのか、どこにFuncA関数の実体はあるのかを教えていただけないでしょうか。
// DUT.h
#ifndef TLM_DUT_H
#define TLM_DUT_H
class DUT{ public:
void FuncA() ;
int ValB ;
} ;
inline // インライン指定しないとコンパイルエラー
void DUT::FuncA(){
...
}
#endif
// DUT.cpp
#include "DUT.h"
// main.cpp
#include "DUT.h"
int main( int, char** ){
return 0;
}
% make
g++ -g -Wall -c DUT.cpp
g++ -g -Wall -c main.cpp
g++ -g -Wall -o run.x DUT.o main.o 2>&1 | c++filt
main.o(.text+0x0): In function `DUT::FuncA()':
<省略>/DUT.h:12: multiple definition of `DUT::FuncA()'
DUT.o(.text+0x0):<省略>/DUT.h:12: first defined here
collect2: ld returned 1 exit status
お礼
ありがとうございます