RealPath:
WebPath:
2017/03/02 13:59 (JST) 更新
VisualC++ >>

同名obj対策

Contents

同名 obj 問題について

別ディレクトリに同名の .cpp ファイルがあるとコンパイル時に出力される .obj ファイル名が被ってシンボル解決に失敗することがある。

プロジェクト構成例

main.cpp
#include <stdio.h>
void f1();
void f2();
int main() {
    printf("hello\n");
    f1();
    f2();
}
a/f.cpp
#include <stdio.h>
void f1(){
    printf("f1\n");
}
b/f.cpp
#include <stdio.h>
void f2(){
    printf("f2\n");
}

出力内容

  • Debug/main.obj
  • Debug/f.obj … a/f.cpp による出力の後、 b/f.cpp による出力により上書きされてしまう

エラー内容

f.obj が上書きされた結果、a/f.cpp 内のシンボルが消失し、以下のようなエラーが発生する。

Error    LNK2019    unresolved external symbol "void __cdecl f1(void)" (?f1@@YAXXZ) referenced in function _main    SampleProj    c:\Projects\SampleProj\SampleProj\main.obj    1    Build    

対策

.obj が入力ファイルの配置に従った相対パスで出力されるようにする。

  • プロジェクト右クリック - Properties
    • Configuration Properties - C/C++ - Output Files
      • Object File Name = $(IntDir)$(IntDir)%(RelativeDir) に変更

対策後の .obj 出力内容

  • Debug/main.obj
  • Debug/a/f.obj
  • Debug/b/f.obj