(这是使用Premake5 alpha二进制文件可在网站上下载)
我试图将现有的VS解决方案移植到使用premake5。
它使用MS样式预编译头文件(stdafx.h / stdafx.cpp)。
当我指定这是我的测试项目时:
pchheader "stdafx.h"
pchsource "stdafx.cpp"
它确实将项目设置为使用预编译头,但它没有设置stdafx.cpp来生成预编译头(/ 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" }

一个相关问题:如何禁用项目中特定文件的预编译头文件使用?如果包含PCH,我的某些文件将无法构建,因此我已在现有解决方案/项目中手动禁用它们。
谢谢!
答案 0 :(得分:1)
可能是因为pchsource
需要文件路径(如files
)因为您的stdafx.cpp
与脚本不在同一个目录中,所以Premake找不到它。尝试使用pchsource "../src_test/cloud/stdafxcpp"
代替它,它应该解决问题。
另外我看到你没有添加"../src_test/cloud/"
作为包含目录,这意味着你的pch标题将被包含在相对路径中,对吧?如果是这样,您需要更新pchheader
以反映这一点。由于Visual Studio的工作方式,您需要设置cpp文件中显示的pchheader
。例如。如果你的cpp文件中有#include "../src_test/cloud/stdafx.h"
,你需要在Premake中使用它:pchheader "../src_test/cloud/stdafx.h"
。
最后,要停用某些文件上的预编译标头,您可以使用过滤器:
-- deactivate precompiled headers for C files
filter "files:**.c"
flags { "NoPCH" }
答案 1 :(得分:0)
我正在将一个脚本从premake 4更改为premake 5,我有一些麻烦要在特定文件上停用pch:
filter "files:myfile.cpp"
flags { "NoPCH" }
它在整个项目中禁用pch而不是在特定文件上。 但这是因为pchsource和pchheader是在过滤后定义的。 当我们标记没有PCH的文件时,必须首先定义pchsource和pchheader。