未跨 premake 携带的预处理器定义包括

Preprocessor definitions not carried across premake includes

提问人:Batres 提问时间:10/26/2023 更新时间:10/31/2023 访问量:51

问:

我有 3 个项目处于预制阶段: 项目 A(静态库):

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

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

    includedirs
    {
        "include"
    }

    defines
    {
        "STATIC_DEFINE"
    }

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

#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"

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

我所期望的是已经定义,因为它包括定义宏的 which include,但输出如下:CSTATIC_DEFINEBA

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

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

我尝试添加

defines 
{
    "STATIC_DEFINE"
}

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

在不将定义添加到预制文件的情况下,任何帮助将不胜感激,谢谢。

C++ 处理器预

评论

0赞 Some programmer dude 10/26/2023
似乎每个项目设置仅针对该项目,而不是为整个工作区全局设置。如何将全局宏添加到顶级预制文件中?
0赞 Batres 10/26/2023
我宁愿避免这种情况,因为在应用程序中,宏只对许多其他库中的一个单独库有用,所以当它影响的唯一文件是STATIC_DEFINEProject A
0赞 Jarod42 10/27/2023
“其中之一包括 dll.h”。中的标头在构建时大多是不需要的(但它们的存在允许在 IDE 中显示它们)。build选项适用于翻译单元(源文件),而不适用于头文件。files
0赞 Batres 10/29/2023
没错,让我改写一下,其中一个包括一个包含 dll.h 的 .cpp,这就是我的意思

答:

0赞 Jarod42 10/27/2023 #1

defines { "STATIC_DEFINE" }

在作用域内,因此仅适用于 。project "A"project "A"

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

您可以为此创建 Lua 函数:

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

然后

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

    useA()

评论

0赞 Batres 10/31/2023
谢谢你,这正是我想知道的,反正它没有继承 bu 谢谢,这有点奇怪
0赞 Jarod42 10/31/2023
拥有 / 定义 than should be inherit 也很常见。因此,无论如何,它都需要一种特殊的语法来选择继承或不继承的内容。DLL_IMPORTDLL_EXPORT