c++ - MSVC : Embedding Data in Program

标签 c++ visual-c++

我希望以前有人遇到过此类问题,并且可以给我提示以解决它。

使用 Microsoft Visual C++ 2005,我在程序中有以下代码:

DWORD locator[FOURXFLAGCOUNT+1]={
    0x58585858, 0x58585858, 0x58585858, 0x58585858, 0x58585858,
    0x58585858, 0x58585858, 0x58585858, 0x58585858, 0x58585858,
    0x58585858, 0x58585858, 0x58585858, 0x58585858, 0x58585858,
    0x58585858, 0x58585858, 0x58585858, 0x58585858, 0x58585858,
    0x58585858, 0x58585858, 0x58585858, 0x58585858, 0x58585858,
    0x58585858, 0x58585858, 0x58585858, 0x58585858, 0x58585858,
    0x58585858, 0x58585858, 0x58585858, 0x58585858, 0x58585858,
    0x58585858, 0x58585858, 0x58585858, 0x00000000
};

想法是让 locator 可以从程序的外部被发现(和填充)——也就是说,另一个程序正在填充它,这样这个程序就会拥有它启动时内置。这是为了防盗,所以没有常规的方法来获取数据,必须这样做。

当我自己编译程序时,这工作得很好,但是当我向程序添加静态库时,数据就消失了。 locator 符号仍然存在;它应该初始化的数据(并且应该在其外部可见)不是。

链接器开关/OPT:NOREF 解决了这个问题,但代价是无法接受的:程序增长了数百 K(看起来不多,但在本例中确实如此)。使用 #pragma comment(linker, "/include:?locator@@BLAHBLAH")(不记得“BLAHBLAH”部分是什么)什么也没做——定位器 符号已经可见,只是没有初始化。将 locator 定义移动到库中也无济于事。

放弃静态库是最后的手段,如果可以避免,我宁愿不这样做。

有什么想法吗?

最佳答案

对于这个问题,我还没有找到任何可接受的解决方案。链接器对它修剪的内容过于激进...也许是一个错误,也许是故意的,但就我的生活而言,我无法想象您想要消除初始化的情况一个变量,同时保留变量本身。

现在,我打开了/OPT:NOREF 选项。我只需要处理额外的大小,至少在我找到解决方法之前是这样。

关于c++ - MSVC : Embedding Data in Program,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2377515/

相关文章:

visual-c++ - 使用 DoMessageBox 将 AfxMessageBox 转换为 CTaskDialog

visual-studio-2010 - 视觉 C++ 2010 : Including boost in several projects in a solution?

c++ - 使用多种类型时是否可以减少我的编译时间?

c++ - 对函数的模糊调用

c++ - Xcode C++ 程序结果不显示正确答案

C++ - 错误 : expected unqualified-id before ‘using’

c++ - 在 OSX 10.7.2 上使用 boost 1.48 boost 日志

c++ - 哪些选项(如果有)在 Visual Studio 2015 中暗示/CLR

CoCreateInstance 在控制台应用程序中挂起

c++ - 使用opencv逐个单元读取表格(图像)的数据