我有一个由 cmake 处理的巨大跨平台项目,其编译时间使用预编译头文件 (PCH) 和 cmake 调用的对象库来加快,这些对象库不过是对象文件的集合。
请注意,我负责在 MakeLists.txt 文件中将 PCH 和对象库设为可选,这很有趣,因为事实证明,使用 CMake 2.8.10.2(最新)和 msvc 10 RTM 同时打开这两个选项会触发“符号双定义”错误,在任何其他设置下都不会出现(其他选项与 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"
为 msvc 和 gcc 提供可选 PCH 和可选对象库的 CMakeLists 内容可在此处获得 ( http://pastebin.com/BAdcpzMb )