如何在编译时判断项目是程序还是库?

Posted

技术标签:

【中文标题】如何在编译时判断项目是程序还是库?【英文标题】:How can I tell at compile time whether the project is a program or a library? 【发布时间】:2012-10-28 19:32:37 【问题描述】:

我想知道该项目是否是一个库,在阅读了帮助后,我编写了这个不起作用的代码:

$IF DEFINED(LIBPREFIX)
    $DEFINE PROJECT_IS_EXECUTABLE
    $UNDEF PROJECT_IS_LIBRARY
$ELSE
    $DEFINE PROJECT_IS_EXECUTABLE
    $UNDEF PROJECT_IS_LIBRARY
$IFEND

我尝试了定义、声明和

$IF (LIBPREFIX = '')

对于 DLL 和程序,每次尝试总是返回相同的结果。 如何仅使用内置编译器指令来做到这一点?

编辑

我的目的是从“PE 文件”中删除额外的信息。

我直接在.dpr项目文件中做,所以不管其他单元是如何编译的,但我不能在DLL项目中做同样的事情。

因此,我正在寻找一种在 DLL 项目中阻止它的方法。

这就是我解决此问题的方法,我将此指令添加到我的 .dpr 程序中:

  $DEFINE STRIPE_PE_INFO
  $DEFINE STRIPE_RTTI
  $I DDC_STRIP.inc

而 DDC_STRIP.inc 拥有所有的逻辑。

【问题讨论】:

【参考方案1】:

在编译文件时无法知道这一点。源文件可以编译为 .dcu,然后链接到任何类型的项目。 RTL 和 VCL 单元就是一个很好的例子。

您能做的最好的事情可能是在您的项目选项中定义一个条件来指示该项目是否是一个库。但是您需要确保在构建任何使用此单元的项目时始终重新编译 .dcu。

【讨论】:

确实,有道理。【参考方案2】:

您无法在编译时确定这一点,但在运行时,您可以检查SysInit.ModuleIsLib (Delphi 2007) 以确定代码是否在库(或包)中运行。

【讨论】:

为了同样的正确性,System.IsLibrary 是您在运行时检测 DLL 所需要的。但是这个问题专门询问了编译时检测,在这种情况下,这些变量都不合适。【参考方案3】:

我能想到的最好的事情是在包含文件中设置一个定义。您可以使用预构建操作(bat 文件)来修改包含文件。

【讨论】:

以上是关于如何在编译时判断项目是程序还是库?的主要内容,如果未能解决你的问题,请参考以下文章

在基于 NetBeans Maven 的项目中,在编程和编译时包含一个库,但从构建中排除

编译 FLTK 程序时的问题

linux 下C标准库是动态库还是静态库,还是两种库都提供了?

Linux Mint (应用软件:QT 5.X编译错误)

CMAKE编译时如何自动下载第三方库并解压安装到指定目录

VS2012编译的DLL动态库为啥在VS2012上调用正常,在VS2008上使用失败