premake5预编译头不起作用

时间:2015-07-16 23:26:12

标签: premake

(这是使用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,我的某些文件将无法构建,因此我已在现有解决方案/项目中手动禁用它们。

谢谢!

2 个答案:

答案 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。