从C调用系统c++函数
Call a system C++ function from C
我有一个C库,我不允许以实质性的方式修改,它大量使用random
函数,这在我的Visual Studio 2010编译器上不可用(参见我的另一个问题)
所以,我必须写我自己的random
方法。我试图使用一个简单的random() { srand(time(NULL)); return rand(); }
,但图书馆的主要概念不喜欢它(他在Mac上,我认为他不关心我的问题)。他告诉我在运行库时只运行一次srand(),但由于这个库中可能有多个入口点,我不知道如何做到这一点。如果你有解决这个问题的方法,我洗耳恭听。
Update:我发现"main"函数总是在加载库期间运行(据我所知),所以我将使用它进行播种。但是我仍然对这个问题的解决方案很感兴趣。更新2:嗯,从main()调用srand()总是产生相同的结果,所以这毕竟不是答案:(
所以我决定采用另一种生成随机数的方法:
#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++编译期间发生的名称混淆。
我已经访问了从C调用c++的经典答案,但我没有看到从C方法调用系统 c++函数的方法。我错过了什么吗?
谢谢!
您的问题似乎是别的:您必须链接到Advapi32.lib
使用CryptReleaseContext
功能。
这样做:
Right click your project -> Properties -> Linker -> Input -> Additional Dependencies
确保Advapi32.lib
在分号分隔的列表中-否则将其添加到那里并重新构建项目。然后解析符号__imp__CryptReleaseContext
应该可以为您的链接器。
- "error: no matching function for call to"构造函数错误
- 什么时候调用组成单元对象的析构函数
- 继承函数的重载解析
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- C++模板来检查友元函数的存在
- 递归函数计算序列中的平方和(并输出过程)
- 对RValue对象调用的LValue ref限定成员函数
- C++17复制构造函数,在std::unordereded_map上进行深度复制
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 为什么使用 "this" 指针调用派生成员函数?
- 将对象数组的引用传递给函数
- 函数调用中参数的顺序重要吗
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用不带参数的函数访问结构元素
- 代码在main()中运行,但在函数中出现错误
- 内置函数可查看CPP中的成员变量
- 如何获取std::result_of函数的返回类型
- 如何在c++中为模板函数实例创建快捷方式
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗