我希望有人之前遇到过这类问题,可以给我一些解决方法。
使用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
符号已经可见,它只是没有被初始化。将locator
定义移动到库中也无济于事。
放弃静态库是最后的选择,如果我能避免它,我宁愿不这样做。
有什么想法吗?
答案 0 :(得分:1)
我无法找到任何可接受的解决方案。链接器对于它修剪的东西过于咄咄逼人......也许是一个错误,也许是故意的,虽然对于我的生活,我无法想象你会想要消除初始化的情况保持变量本身的变量。
目前,我已打开/ OPT:NOREF选项。我只需要处理额外的尺寸,至少在我找到解决方法之前。
答案 1 :(得分:0)
您可以尝试将DWORD定位器更改为静态DWORD定位器。不确定它是否会有所帮助,只是一个想法。或者,在代码中的其他位置包含对定位器的引用。
答案 2 :(得分:0)
添加使用locator
的功能,例如它构建了xor。您不需要调用此函数,但必须通过将其添加到.DEF文件或使用__declspec( DllExport )
来导出它。
答案 3 :(得分:0)
定位器是否因为没有引用它而被优化的问题?在你的主程序中加入这样的东西有帮助吗?
DWORD d=0;
int i=0;
for (i=0; i<FOURXFLAGCOUNT; i++) d += locator[i];
或者就是这样,但也许不是在所有编译器上:
(void)locator[0];
答案 4 :(得分:0)
如果声明数组extern,它会有所不同吗?