我希望以前有人遇到过此类问题,并且可以给我提示以解决它。
使用 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/