プリコンパイル済みヘッダー (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 )から入手できます。