error LNK2019: 未解析的外部符号 __imp____acrt_iob_func 在 VS2019 中的函数 _printf 中引用
error LNK2019: unresolved external symbol __imp____acrt_iob_func referenced in function _printf in VS2019
我正在使用 Visual Studio 2019 社区版,我正在尝试 运行 来自 C 程序的汇编函数。
我收到以下错误:
Rebuild started...
1>------ Rebuild All started: Project: ArrayReverser, Configuration: Debug Win32 ------
1>Assembling GetValueFromASM.asm...
1>ArrayReverser.cpp
1>ArrayReverser.obj : error LNK2019: unresolved external symbol __imp__srand referenced in function _main
1>ArrayReverser.obj : error LNK2019: unresolved external symbol __imp__rand referenced in function _main
1>ArrayReverser.obj : error LNK2019: unresolved external symbol __imp____acrt_iob_func referenced in function _printf
1>ArrayReverser.obj : error LNK2019: unresolved external symbol __imp____stdio_common_vfprintf referenced in function __vfprintf_l
1>C:\Users\firas\source\repos\ArrayReverser\Debug\ArrayReverser.exe : fatal error LNK1120: 4 unresolved externals
1>Done building project "ArrayReverser.vcxproj" -- FAILED.
========== Rebuild All: 0 succeeded, 1 failed, 0 skipped ==========
我已经尝试了几乎所有我能在 Internet 上找到的解决方案,但没有任何效果,我希望有人能提供有关正在发生的事情的见解。
这是 C 代码:
#include <iostream>
#include <stdlib.h>
extern "C" void GetValueFromASM(int* y, const int *x, int n);
int main(int argc, char* argv[])
{
const int n = 10;
int x[n], y[n];
srand(41);
for (int i = 0; i < n; i++)
x[i] = rand() % 1000;
GetValueFromASM(y, x, n);
printf("\n---------------Array Reverser-------------\n");
for (int i = 0; i < n; i++)
{
printf("i: %5d y: %5d x: %5d\n", i, y[i], x[i]);
}
return 0;
}
这里是汇编代码:
.386
.model flat,c
.code
GetValueFromASM PROC
push ebp ;we pushed the register ebp onto the stack
mov ebp,esp
push esi
push edi
xor eax,eax
;now we load the parameters (int* y, const int* x, int n) onto edi,esi,ecx
mov edi,[ebp+8] ;bp - stack base Pointer Register
mov esi,[ebp+12]
mov ecx,[ebp+16]
; in order to reverse the array elemtns we use the following command
lea esi,[esi+ecx*4-4]
pushfd
std
@@: lodsd
mov [edi], eax
add edi, 4
dec ecx
jnz @B
popfd
mov eax,1
;Epilouge
pop edi
pop esi
pop ebp
GetValueFromASM endp
end
link 到我的项目文件:
https://drive.google.com/file/d/1entjG8nHarDTW0AEmvKhv0Cvrw9v0BF2/view?usp=sharing
我下载了您的项目并观察到类似的链接器错误(实际上我有更多错误)。我检查了该项目的所有链接器选项,注意 粗体 的条目。粗体选项未被继承。其中最突出的是 Entrypoint
:
您使用 MASM 函数覆盖了默认的 C 启动入口点 Reverser
。我修改了 EntryPoint
使其成为 空白 (将其删除)。当我重建项目时,不再有链接器错误。
你的Reverser
函数最后没有ret
所以它会在运行时抛出异常。我在 Reverser
函数和 运行 代码的底部添加了一个 ret
并得到了这个输出:
注意:@rustyx 有很好的建议“在 MSVC 配置方面,尝试所有解决方案通常不是一个好主意。事实上,应该非常小心不要改变任何你不知道其影响的东西。现在创建一个全新的项目可能是值得的。“。如果您创建一个全新的 CONSOLE 项目并且不修改入口点,应该没有问题。
我正在使用 Visual Studio 2019 社区版,我正在尝试 运行 来自 C 程序的汇编函数。
我收到以下错误:
Rebuild started...
1>------ Rebuild All started: Project: ArrayReverser, Configuration: Debug Win32 ------
1>Assembling GetValueFromASM.asm...
1>ArrayReverser.cpp
1>ArrayReverser.obj : error LNK2019: unresolved external symbol __imp__srand referenced in function _main
1>ArrayReverser.obj : error LNK2019: unresolved external symbol __imp__rand referenced in function _main
1>ArrayReverser.obj : error LNK2019: unresolved external symbol __imp____acrt_iob_func referenced in function _printf
1>ArrayReverser.obj : error LNK2019: unresolved external symbol __imp____stdio_common_vfprintf referenced in function __vfprintf_l
1>C:\Users\firas\source\repos\ArrayReverser\Debug\ArrayReverser.exe : fatal error LNK1120: 4 unresolved externals
1>Done building project "ArrayReverser.vcxproj" -- FAILED.
========== Rebuild All: 0 succeeded, 1 failed, 0 skipped ==========
我已经尝试了几乎所有我能在 Internet 上找到的解决方案,但没有任何效果,我希望有人能提供有关正在发生的事情的见解。
这是 C 代码:
#include <iostream>
#include <stdlib.h>
extern "C" void GetValueFromASM(int* y, const int *x, int n);
int main(int argc, char* argv[])
{
const int n = 10;
int x[n], y[n];
srand(41);
for (int i = 0; i < n; i++)
x[i] = rand() % 1000;
GetValueFromASM(y, x, n);
printf("\n---------------Array Reverser-------------\n");
for (int i = 0; i < n; i++)
{
printf("i: %5d y: %5d x: %5d\n", i, y[i], x[i]);
}
return 0;
}
这里是汇编代码:
.386
.model flat,c
.code
GetValueFromASM PROC
push ebp ;we pushed the register ebp onto the stack
mov ebp,esp
push esi
push edi
xor eax,eax
;now we load the parameters (int* y, const int* x, int n) onto edi,esi,ecx
mov edi,[ebp+8] ;bp - stack base Pointer Register
mov esi,[ebp+12]
mov ecx,[ebp+16]
; in order to reverse the array elemtns we use the following command
lea esi,[esi+ecx*4-4]
pushfd
std
@@: lodsd
mov [edi], eax
add edi, 4
dec ecx
jnz @B
popfd
mov eax,1
;Epilouge
pop edi
pop esi
pop ebp
GetValueFromASM endp
end
link 到我的项目文件: https://drive.google.com/file/d/1entjG8nHarDTW0AEmvKhv0Cvrw9v0BF2/view?usp=sharing
我下载了您的项目并观察到类似的链接器错误(实际上我有更多错误)。我检查了该项目的所有链接器选项,注意 粗体 的条目。粗体选项未被继承。其中最突出的是 Entrypoint
:
您使用 MASM 函数覆盖了默认的 C 启动入口点 Reverser
。我修改了 EntryPoint
使其成为 空白 (将其删除)。当我重建项目时,不再有链接器错误。
你的Reverser
函数最后没有ret
所以它会在运行时抛出异常。我在 Reverser
函数和 运行 代码的底部添加了一个 ret
并得到了这个输出:
注意:@rustyx 有很好的建议“在 MSVC 配置方面,尝试所有解决方案通常不是一个好主意。事实上,应该非常小心不要改变任何你不知道其影响的东西。现在创建一个全新的项目可能是值得的。“。如果您创建一个全新的 CONSOLE 项目并且不修改入口点,应该没有问题。