1

プリコンパイル済みヘッダー (PCH) を使用してコンパイル時間が高速化された cmake によって処理される巨大なクロスプラットフォーム プロジェクトと、オブジェクト ファイルのコレクションに過ぎないオブジェクト ライブラリを呼び出す cmake があります。

CMake 2.8.10.2 (最新) と msvc 10 RTM を使用して両方のオプションを同時に有効にすると、「シンボルの二重定義」がトリガーされることが判明したため、MakeLists.txt ファイルで PCH とオブジェクト ライブラリをオプションにすることに注意してください。他のセットアップでは表示されないエラー (MSVC10 との他のオプションの組み合わせ、または GCC と clang との任意のオプションの組み合わせ)

error LNK2005: "int `anonymous namespace'::defined_twice_if_msvc_plus_precompiled_headers_plus_object_library" (?defined_twice_if_msvc_plus_precompiled_headers_plus_object_library@?A0x57991313@@3HA) was already defined in common-header.obj C:\git\bug\build\common-header.obj  main

コード (以下) は非常に単純です: メイン エントリ ポイント (main.cpp)、オプションで cmake オブジェクト ライブラリ (lib.cpp) にパッケージ化されたソース ファイル、エントリ ポイントとそのヘッダー (lib .hpp)、オプションでプリコンパイルされた共通ヘッダー (common-header.hpp)、最後にプリコンパイル済みヘッダーに対応するソース ファイル (MSVC10 の /Yc オプションの場合、GCC / Clang には使用できません)。

だから私の質問は:

  • このコードは標準でコンパイルする必要がありますか? 答えはイエスだと思います。
  • はいの場合、問題は CMake または MSVC10 から発生していますか?

ありがとう


(以下の内容で完全に再現可能)

main.cpp の内容:

#include "common-header.hpp"
#include "lib.hpp"

int main ()
{
}

common-header.hpp の内容:

#ifndef _INCL_COMMON_HEADER
#define _INCL_COMMON_HEADER

//variable inside anonymous namespace mimics the troublemaking code inside #include <boost/asio.hpp>
namespace {
    int defined_twice_if_msvc_plus_precompiled_headers_plus_object_library;
}
#endif

lib.hpp の内容:

//empty

lib.cpp の内容:

#include "common-header.hpp"
#include "lib.hpp"

common-header.cpp の内容: (MSVC プリコンパイル済みヘッダーにのみ必要)

#include "common-header.hpp"

オプションの PCH と、msvc および gcc 用のオプションのオブジェクト ライブラリを提供する CMakeLists のコンテンツは、こちら ( http://pastebin.com/BAdcpzMb )から入手できます。


4

0 に答える 0