我正在尝试知道项目是否是一个库,在阅读了我编写的代码后,该代码无效:
{$IF DEFINED(LIBPREFIX)}
{$DEFINE PROJECT_IS_EXECUTABLE}
{$UNDEF PROJECT_IS_LIBRARY}
{$ELSE}
{$DEFINE PROJECT_IS_EXECUTABLE}
{$UNDEF PROJECT_IS_LIBRARY}
{$IFEND}
我尝试过DEFINED,DECLARED和
{$IF (LIBPREFIX = '')}
每次尝试总是为DLL和程序返回相同的内容。 我怎么能只使用内置的编译器指令呢?
修改
我的目的是从“PE文件”中删除额外信息。
我直接在.dpr项目文件中执行,所以无论其他单元是如何编译的,但我在DLL项目中都不能这样做。
因此我正在寻找一种在DLL项目中阻止它的方法。
这就是我解决这个问题的方法,我将这个指令添加到我的.dpr程序中:
{$DEFINE STRIPE_PE_INFO}
{$DEFINE STRIPE_RTTI}
{$I DDC_STRIP.inc}
DDC_STRIP.inc具有所有逻辑。
答案 0 :(得分:11)
编译文件时无法知道这一点。源文件可以编译为.dcu,然后链接到任何类型的项目。一个很好的例子是RTL和VCL单元。
您可以做的最好的事情是在项目选项中定义一个条件,指示项目是否是库。但是,在构建使用此单元的任何项目时,您需要确保始终重新编译.dcu。
答案 1 :(得分:6)
您无法在编译时确定这一点,但在运行时,您可以检查SysInit.ModuleIsLib
(Delphi 2007)以确定代码是否在库(或包)中运行。
答案 2 :(得分:1)
我能想到的最好的事情是在包含文件中设置一个定义。您可以使用预构建操作(bat文件)来修改包含文件。