1

我有一个由 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 )


4

0 回答 0