gpt4 book ai didi

c - 使用嵌入式 R.dll 编译的 C 程序在调用标准 C 函数 fprintf() 时崩溃

转载 作者:行者123 更新时间:2023-11-30 19:41:49 25 4
gpt4 key购买 nike

我正在使用 MSVC2013 Update 5 和 Revolution R 3.2.2 x64 中的 R.dll 导入库来编译自定义版本的 Rserve ( https://rforge.net/Rserve/ ),它使用嵌入的 R.dll。 CRT类型是多线程调试DLL。以一种非常奇怪的方式调用 fprintf(stderr, ...) 时程序崩溃:

ntdll.dll!RtlRaiseStatus()  Unknown
ntdll.dll!string "Enabling heap debug options\n"() Unknown
ntdll.dll!RtlEnterCriticalSection() Unknown
msvcrt.dll!_lock_file() Unknown
msvcrt.dll!putc() Unknown
R.dll!000000006c8dd814() Unknown
R.dll!000000006c8df8e8() Unknown
R.dll!000000006c8e3d74() Unknown
R.dll!000000006c8dd00d() Unknown
RServe.exe!loadConfig(const char * fn) Line 2113 C
RServe.exe!main(int argc, char * * argv) Line 4247 C
[External Code]

代码是这样的:

 if(checkScriptFileName(p) != 0)
fprintf(stderr, "Error: Invalid script file name: '%s'.\n", p);

根据我的理解,fprintf()应该位于msvcr120d.dll中,但它以某种方式访问​​msvcrt.dll并通过R.dll。

有人遇到过类似的问题吗?您能建议一下,在这种情况下我该怎么做才能解决这个问题? (对于那些不理解这个问题的人)问题是如何修复此崩溃(通常不应发生,因为我已将所有正确的参数传递给 fprintf())。

更新:更多有趣的细节 - 尝试切换到 CRT 的静态变体,得到以下有趣的东西:

1>  Generating Code...
1>LIBCMTD.lib(sprintf.obj) : error LNK2005: sprintf already defined in R.lib(R.dll)
1>LIBCMTD.lib(printf.obj) : error LNK2005: printf already defined in R.lib(R.dll)

最佳答案

我想出了以下解决方案。这是我从 R.dll 手动生成导入库的脚本:

:: Read more at the http://stackoverflow.com/questions/9946322/how-to-generate-an-import-library-lib-file-from-a-dll
setlocal
call "C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\vcvarsall.bat" amd64
SET MACHINE=x64
SET LIBNAME=R
dumpbin /exports %LIBNAME%.dll > %LIBNAME%.exports
echo LIBRARY R > %LIBNAME%.def
echo EXPORTS >> %LIBNAME%.def
for /f "skip=19 tokens=4" %%A in (%LIBNAME%.exports) do echo %%A >> %LIBNAME%.def
start /wait win32pad.exe %LIBNAME%.def
lib /def:%LIBNAME%.def /out:%LIBNAME%.lib /machine:%MACHINE%
endlocal

事实上,我已经添加了这个

start /wait win32pad.exe %LIBNAME%.def

在运行 lib.exe 之前。这个启动文本编辑器允许我手动编辑 DEF 文件,并从中删除所有实际上应该来自 native 工具集的 CRT 版本的“printf”(有多个)。

链接到经过调整的导入库后,问题就消失了。

我希望这对于那些想要将 R 嵌入到 Windows 应用程序中的人来说是有用的信息。

关于c - 使用嵌入式 R.dll 编译的 C 程序在调用标准 C 函数 fprintf() 时崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33136486/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com