将静态库链接到dll

时间:2014-08-12 11:42:01

标签: c++ winapi dll static-libraries

在windows编程中, 如果你有一个静态库,它打算与一个dll库链接,其中dll定义了/ SUBSYSTEM:WINDOWS,那么应该在静态库中定义以下哪个marcos?

_LIB
_WINDOWS

我混淆了这些宏,因为它自己的静态库永远不会显示它自己的窗口或控制台,所以我无法理解为什么我们需要为静态库项目定义这些宏?

2 个答案:

答案 0 :(得分:1)

在与谷歌争夺各种论坛和白皮书之后,我发现了使用visual studio时的一切意义!

静态库: 不需要/ ENTRY或/ SUBSYSTEM,因为代码将链接到另一个代码。 因此库不需要控制台,windnow或入口点

<强> DLL: / SUBSYSTEM应该设置为WINDOWS并且不应该设置/ ENTRY,为什么? 没有条目,因为在visual studio链接器automaticaly中创建了一个DllMain入口点。 dll的子系统应设置为WINDOWS link1 link2 另一个考试为什么WINDOWS

<强> EXE: 应明确设置/ SUBSYSTEM和/ ENTRY,如果未设置,链接器将再次自动设置子系统AND入口点,如上面的链接所示。

所以要回答我原来的问题,以上都没有&#34;愚蠢&#34;必须定义宏:)

答案 1 :(得分:1)

只需几点:

  • 静态库中的函数完全可以创建和操作UI,User32窗口或控制台(我猜现代UI也是如此)。

  • 除非您为此目的提供特殊功能,否则使用您的库的应用程序无法分辨用于库编译的宏。

  • 如果您尚未定义任何一组宏,Windows标题有时会提供默认值 (例如WINVER

  • 这些宏只会像你的代码那样神奇。如果你没有测试它们,那么定义它们几乎没有效果。

  • 如果您的库有条件地提供UI功能,那么在编译时使用#if defined(_WINDOWS)跳过这些功能比运行时启用标志有一些优势。

特别是,如果预处理器剥离了对UI函数的调用,则链接器不需要将UI DLL添加到导入表中。您的库是否可以在Windows的Server Core安装上运行,这可能会有所不同。同时,运行时检查很好,因为您只需编译一次库并分发一个版本。使用运行时启用标志并将链接器设置为使用延迟加载可能会提供两全其美的效果。