未跨预制作包含的预处理器定义

问题描述 投票:0回答:1

我有 3 个项目正在预制中: 项目A(静态库):

project "A"
    kind "StaticLib"
    language "C++"
    staticruntime "on"

    files
    {
        "src/**.h",
        "src/**.cpp",
        
        "include/**.h"
    }

    includedirs
    {
        "include"
    }

    defines
    {
        "STATIC_DEFINE"
    }

在项目 A 的 dll.h 文件中,我有:

#ifdef STATIC_DEFINE
#pragma message("Static Define")
#else 
#pragma message("No Static Define")
#endif

另外两个项目是:

project "B"
    kind "StaticLib"
    language "C++"
    staticruntime "on"
    
    files
    {
        some project files, one of them includes dll.h
    }

    links
    {
        "A"
    }
Project "C"
    kind "ConsoleApp"
    language "C++"
    staticruntime "on"

    files
    {
        again, project files, one includes dll.h
    }

    links
    {
        "B"
    }

有一个包含所有内容的最终预制文件

workspace "Workspace"
    architecture "x86_64"
    startproject "C"

include "libs/A"
include "libs/B"
include "C"

这不是我的预制文件中的实际代码,它们有点臃肿,我认为伪代码足以解释问题并修复它,如果有必要,我可以编辑问题并添加完整的预制文件和项目结构。

我期望的是

C
定义了
STATIC_DEFINE
,因为它包括
B
,其中包括定义宏的
A
,但输出如下:

Build started(A):
Static Define
Build started(B):
No Static Define
Build started(C)
No Static Define

同样,这不是完整的输出,因为它是一个完整的应用程序,有相当多的文件,并且其中大部分与问题无关,但如果需要,我可以提供它

我尝试添加

defines 
{
    "STATIC_DEFINE"
}

Project B
,然后它出现在
Project B
的输出中,但不出现在
Project C
的输出中 只有当我将定义添加到所有 3 个预制文件中时,它才起作用

任何无需将定义添加到预制文件中即可完成此操作的帮助将不胜感激,谢谢。

c++ preprocessor premake
1个回答
0
投票

你的

defines { "STATIC_DEFINE" }

处于

project "A"
范围,因此仅适用于
project "A"

(还没有?)从某些属性“继承”的用法(

includedir
links
defines
)。

你可以为此创建 Lua 函数:

function UseA()
    defines { "STATIC_DEFINE" }
    includedirs { "include" }
    links {"A"}
end

然后

project "B"
    kind "StaticLib"
    language "C++"
    staticruntime "on"
    
    files
    {
        -- some project files
    }

    useA()
© www.soinside.com 2019 - 2024. All rights reserved.