C程序中的链接器错误:LNK2019和LNK1120

时间:2014-06-26 16:59:18

标签: c makefile

按照上一个问题:Compile a C library with Visual Studio 2010;我有一个C项目,有一个我无法改变的源文件。

修复上一个问题后,我现在还有两个错误:

error LNK2019: unresolved external symbol _random referenced in the function _fisher_yates myfile.obj
error LNK1120: 1 unresolved external myproject.dll

引用_random的行是:

j = i + random() % (nb - i);

我猜测random()不是标准C / C ++库的一部分?

一位同事建议查看包含库的makefile,看看会丢失什么。我发现了这个:

LIBRUBYARG_SHARED = -l$(RUBY_SO_NAME)
LIBRUBYARG_STATIC = -l$(RUBY_SO_NAME)-static

再远一点:

LIBS = $(LIBRUBYARG_SHARED)  -lshell32 -lws2_32 -limagehlp -lshlwapi  

在我的c文件顶部,我添加了:

#ifdef _MSC_VER
#define inline __inline
#pragma comment(lib, "shell32.lib")
#pragma comment(lib, "Ws2_32.lib")
#pragma comment(lib, "imagehlp.lib")
#pragma comment(lib, "shlwapi.lib")
#endif

但我仍然得到同样的错误,所以我猜这是导致问题的LIBRUBYARG_SHARED。我甚至不知道它是什么; makefile是通过'mkmf'生成的。

正如您可能注意到的,我不知道发生了什么,并且感谢任何帮助。

谢谢!

更新

#ifdef _MSC_VER部分,我添加了#define random rand指令。虽然rand() is not safe,这与安全无关(它是在屏幕上随机播放对象),所以我认为这就足够了。

更新2

实际上只是将随机“绑定”到rand是不够的,因为如果不与srand一起使用,rand将返回相同的值。所以,在this article之后,我编写了自己的random()函数:

#ifdef _MSC_VER

// fix: the Visual Studio 2010 C compiler doesn't know "inline" but knows "__inline".
// see: https://stackoverflow.com/a/24435157/2354542
#define inline __inline

#include <Windows.h>
#include <wincrypt.h>

/// Visual C++ 2010 is not POSIX compliant :'( so I have to code a random() method
/// https://www.securecoding.cert.org/confluence/display/seccode/MSC30-C.+Do+not+use+the+rand%28%29+function+for+generating+pseudorandom+numbers
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;
    }
}

#endif

1 个答案:

答案 0 :(得分:1)

你可以使用rand()函数,它是stdlib的一部分