我有一个C库,我实际上不允许以实质性的方式进行修改,它大量使用random
函数,这在我的Visual Studio 2010编译器中是不可用的(参见{{3 }})
所以,我必须编写自己的random
方法。我尝试使用一个简单的random() { srand(time(NULL)); return rand(); }
,但图书馆的主要概念并不喜欢它(他在Mac上,我认为他并不关心我的问题)。他告诉我在运行库时只运行一次srand(),但由于这个库中可能有多个入口点,我不知道该怎么做。如果您有此问题的解决方案,我全心全意。
更新:我发现" main"函数总是在加载库时运行(根据我的理解),所以我将它用于播种。但是我仍然对这个特定问题的解决方案感兴趣 更新2 :好吧,从main()调用srand()会产生相同的结果,因此毕竟不是答案:(
所以我决定跟随生成随机数的another one of my questions:
#include <Windows.h>
#include <wincrypt.h>
long int random() {
HCRYPTPROV prov;
if (CryptAcquireContext(&prov, NULL, NULL, PROV_RSA_FULL, 0)) {
long int li = 0;
if (CryptGenRandom(prov, sizeof(li), (BYTE *)&li)) {
return li;
} else {
// random number not generated
return 0;
}
if (!CryptReleaseContext(prov, 0)) {
// context not released
return 0;
}
} else {
// context not created
return 0;
}
}
但后来我遇到了这样的错误:
错误LNK2019:未解析的外部符号__imp__CryptReleaseContext @ 8 在函数_random
中引用
如果我理解正确,问题在于我从C调用C ++函数,并且C不理解在C ++编译期间发生的名称错误。
我已经访问过another method从C调用C ++,但我没有看到从C方法调用系统 C ++函数的方法。有没有我错过的东西?
谢谢!
答案 0 :(得分:3)
您的问题似乎是其他问题:您必须与Advapi32.lib
关联才能使用CryptReleaseContext
功能。
这样做:
Right click your project -> Properties -> Linker -> Input -> Additional Dependencies
确保Advapi32.lib
位于分号分隔列表中 - 否则将其添加到那里并重建项目。然后,您的链接器应该可以解析符号__imp__CryptReleaseContext
。