从C调用系统c++函数

Call a system C++ function from C

本文关键字:c++ 函数 系统 调用      更新时间:2023-10-16

我有一个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应该可以为您的链接器。