sha*_*kin 36 resources static-libraries visual-c++
是否可以将资源构建到静态库中,并通过简单地链接到库来重用它们?
我主要考虑的是你在库中调用一个函数然后访问资源的情况.
Dim*_* C. 57
在Visual C++(2008)中,在静态库中使用资源(图像,对话框等)所需要做的唯一事情就是在项目中包含静态库的关联.res文件.这可以在"项目设置/链接器/输入/附加依赖性"中完成.
使用此解决方案,静态库的资源将打包到.exe中,因此您不需要额外的DLL.遗憾的是,Visual Studio不会像.lib文件那样自动包含.res文件(当使用"项目依赖项" - 特性时),但我认为这个额外的小步骤是可以接受的.
我已经为这个解决方案寻找了很长时间,现在让我感到惊讶的是这很简单.唯一的问题是它完全没有记录.
Rog*_*mbe 24
它可以完成,但是非常痛苦:你不能通过简单地链接静态库来实现它.
考虑一下:资源嵌入在EXE或DLL中.当静态库中的某些代码调用(例如)LoadIcon时,它将从与其链接的EXE或DLL中获取资源.
因此,如果您的静态库需要资源可用,那么您有几个选择:
CreateDialogIndirect.请参阅Raymond Chen的"在运行时构建对话框模板".char my_dialog_resource[] = { .... };,然后使用(例如)CreateDialogIndirect.您可能需要查找(或编写)从.RES文件转换为文件的实用程序.CPP..RC文件)和相应的头文件来发送LIB 文件.然后你就#include相关了.您需要为LIB保留一系列资源ID,以便它们不会与主EXE或DLL的资源ID冲突.这是MFC用作静态库时的作用.或者您可以使用字符串资源ID(这不适用于STRINGTABLE资源).小智 10
我刚刚使用MS Visual Studio编译器完成了这项工作.我们将一些遗留项目从DLL转换为静态库.其中一些DLL中嵌入了对话框或字符串资源.通过"TEXTINCLUDE"机制将它们包含在主应用程序的RC脚本文件中,我能够将这些DLL的.RC脚本编译到我们的主应用程序中.我发现通过直接编辑RC文件来实现这一点最简单,但Visual Studio也提供了更多"向导"机制.其他编译器中的实现很可能不同.
要直接操作主RC脚本:
0.1.在"2 TEXTINCLUDE"部分中,包含定义库的资源ID的头文件.语法是
2 TEXTINCLUDE
BEGIN
"#include ""my_first_lib_header.h""\r\n"
"#include ""my_second_lib_header.h""\0"
END
Run Code Online (Sandbox Code Playgroud)
0.2.在"3 TEXTINCLUDE"部分中,包含库中的RC脚本.
3 TEXTINCLUDE
BEGIN
"#include ""my_first_library.rc""\r\n"
"#include ""my_second_library.rc""\0"
END
Run Code Online (Sandbox Code Playgroud)
第3步和第4步应该会自动发生,但我发现自己输入它们更可靠,而不是依靠Microsoft的资源脚本编译器来处理事情.
0.3.将库资源定义的头文件添加到只读符号列表中.此列表通常位于文件顶部附近.
#define APSTUDIO_READONLY_SYMBOLS
#include "my_first_lib_header.h"
#include "my_second_lib_header.h"
#undef APSTUDIO_READONLY_SYMBOLS
Run Code Online (Sandbox Code Playgroud)
0.4.在APSTUDIO_INVOKED部分中包含库的RC脚本.这通常位于文件的底部.
#ifndef APSTUDIO_INVOKED
#include "my_first_library.rc"
#include "my_second_library.rc"
#endif
Run Code Online (Sandbox Code Playgroud)
您也可以通过Visual Studio IDE自动执行所有这些操作,但我发现它并不总是适用于我预期的情况.
如果库的资源脚本引用磁盘上的任何文件(文本文件,图标文件等),则需要确保主应用程序项目知道在哪里找到它们.您可以将这些文件复制到应用程序可以找到它们的某个位置,也可以在编译器设置中添加其他包含路径.
要添加其他包含路径: