按照上一个问题: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,这与安全无关(它是在屏幕上随机播放对象),所以我认为这就足够了。
实际上只是将随机“绑定”到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
答案 0 :(得分:1)
你可以使用rand()函数,它是stdlib的一部分