premake5 预编译 headers 不工作

premake5 precompiled headers not working

(这是使用可在网站上下载的 Premake5 alpha 二进制文件)

我正在尝试将我现有的 VS 解决方案移植到使用 premake5。

它使用预编译的 MS 风格 headers(stdafx.h/stdafx.cpp)。

当我指定这是我的测试项目时:

pchheader "stdafx.h"
pchsource "stdafx.cpp"

它确实将项目设置为使用预编译的 headers,但它没有设置 stdafx.cpp 以生成预编译的 headers(/Yc)。相反,项目中的所有文件都试图使用 (/Yu) 并且没有人生成 PCH。所以它不会构建..

我猜这确实有效,我在这里缺少什么黑魔法?

这是我的整个premake5文件供参考

-- premake5.lua
solution "Cloud"
   configurations { "Debug", "Release", "Final" }
   platforms { "Win32_AVX2", "Win64_AVX2"}
   location "premake"
   
flags{"MultiProcessorCompile", "ExtraWarnings", "FatalCompileWarnings", "FatalLinkWarnings", "FloatFast"}

startproject "Cloud"
vectorextensions "AVX2"

filter { "platforms:Win32" }
 system "Windows"
 architecture "x32"
filter { "platforms:Win64" }
 system "Windows"
 architecture "x64"
 
filter "configurations:Debug"
    defines { "DEBUG" }
    flags { "Symbols" }
filter "configurations:Release"
    defines { "NDEBUG" }
 flags{"Symbols"}
    optimize "Speed"
filter "configurations:Final"
    defines { "NDEBUG" }
 flags{"LinkTimeOptimization"}
    optimize "Speed"
 
group "app"

--primary executable 
project "Cloud"
 location "../src_test/cloud"
 kind "ConsoleApp"
 language "C++"
 targetdir "..//%{cfg.buildcfg}"
 pchheader "stdafx.h"
 pchsource "stdafx.cpp"
 vpaths{
  {["src/pch/*"] = "../src_test/cloud/stdafx.*"},
  {["src/*"] = "../src_test/cloud/**.cpp"},
  {["module/*"] = "../src_test/cloud/Module*.h"},
  {["core/*"] = "../src_test/cloud/Core*.h"},
  {["headers*"] = "../src_test/cloud/*.h"},
  --{["src_c/*"] = "../src_test/cloud/**.c"}
 }
 files { "../src_test/cloud/*.h", "../src_test/cloud/*.c", "../src_test/cloud/*.cpp", "../src_test/cloud/*.hpp" } 

一个相关问题:如何禁用项目中特定文件的预编译 header 使用?如果包含 PCH,我的一些文件将无法构建,因此我在现有 solution/projects.

中手动禁用了它们

谢谢!

可能是因为pchsource需要一个文件路径(比如files)因为你的stdafx.cpp和你的脚本不在同一个目录,Premake找不到它。请尝试使用 pchsource "../src_test/cloud/stdafxcpp",它应该可以解决问题。

我还看到您没有将 "../src_test/cloud/" 添加为包含目录,这意味着您的 pch header 将使用相对路径包含,对吗?如果是这样,您需要更新 pchheader 以反映这一点。由于 Visual Studio 的工作方式,您需要设置 pchheader,因为它出现在您的 cpp 文件中。例如。如果在你的 cpp 文件中你有 #include "../src_test/cloud/stdafx.h" 你需要在 Premake 中使用它:pchheader "../src_test/cloud/stdafx.h".

最后,要停用某些文件的预编译 header,您可以使用过滤器:

-- deactivate precompiled headers for C files
filter "files:**.c"
    flags { "NoPCH" }

我正在将脚本从 premake 4 更改为 premake 5,我在使用以下命令停用特定文件上的 pch 时遇到了一些麻烦:

filter "files:myfile.cpp"
    flags { "NoPCH" }

它在整个项目上禁用 pch,而不是在特定文件上。 但这是因为pchsource和pchheader是过滤后定义的。 当我们标记一个没有 PCH 的文件时,必须先定义 pchsource 和 pchheader。