我有一个巨大的跨平台项目由cmake处理,其编译时间使用预编译头(PCH)加速,cmake调用的对象库只是对象文件的集合。
请注意,我在MakeLists.txt文件中选择了PCH和对象库是可选的,因为事实证明使用CMake 2.8.10.2(最新)和msvc 10 RTM同时转换两个选项会触发“符号双-definition“错误,在任何其他设置下都没有显示(其他选项与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),其内容应该可以从入口点访问header(lib.hpp),一个可选择预编译的公共头(common-header.hpp),最后是一个与预编译头相对应的源文件(对于MSVC10的/ Yc选项,对GCC / Clang没用)。 / p>
所以我的问题是:
由于
(完全可以与以下内容重现)
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"
CMakeLists的内容,为msvc&amp;提供可选的PCH和可选对象lib。 gcc可在此处获取(http://pastebin.com/BAdcpzMb)