Assembly 错误LNK2019:VS2019中的函数printf中引用了未解析的外部符号\uuuuu imp\uuuuuuuuu acrt\u iob\u func
我正在使用VisualStudio2019社区版,我正在尝试从C程序运行汇编函数 我得到以下错误:Assembly 错误LNK2019:VS2019中的函数printf中引用了未解析的外部符号\uuuuu imp\uuuuuuuuu acrt\u iob\u func,assembly,visual-c++,x86,linker,masm,Assembly,Visual C++,X86,Linker,Masm,我正在使用VisualStudio2019社区版,我正在尝试从C程序运行汇编函数 我得到以下错误: Rebuild started... 1>------ Rebuild All started: Project: ArrayReverser, Configuration: Debug Win32 ------ 1>Assembling GetValueFromASM.asm... 1>ArrayReverser.cpp 1>Array
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 ==========
我已经尝试了在互联网上找到的几乎所有解决方案,但没有任何效果,我希望有人能对正在发生的事情提供见解
下面是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;
}
链接到我的项目文件:
我下载了你的项目,发现了类似的链接器错误(实际上我有更多的错误)。我查看了项目的所有链接器选项,注意了粗体的条目。粗体显示的选项未被继承。突出的一个是入口点: 使用MASM函数
反向器
覆盖默认的C启动入口点。我修改了入口点
,使其为空(将其删除)。当我重建项目时,不再存在链接器错误
您的Reverser
函数末尾没有ret
,因此运行时会抛出异常。我在Reverser
函数的底部添加了一个ret
,然后运行代码并得到以下输出:
注意:@rustyx有一个非常好的建议:“当涉及到MSVC配置时,尝试每种解决方案通常都是一个坏主意。事实上,应该非常小心,不要改变任何你不知道的效果。现在创建一个新的项目可能是值得的。”。如果您创建了一个新的控制台项目,并且没有修改入口点,那么应该没有问题。确保您也有
#include
。您是否链接到遗留的\u stdio\u definitions.lib
?如果删除程序集,项目是否编译?看起来stdio的东西只在C中使用,所以程序集只是噪音,而不是问题的一部分。当涉及到MSVC配置时,尝试每一种解决方案通常是一个坏主意。事实上,应该非常小心,不要改变任何你不知道效果的东西。现在可能值得创建一个新项目。这是否回答了您的问题@杰斯特:我包括了那个图书馆,没什么变化。@MichaelPetch,我做到了。不幸的是,它仍然不起作用。你猜为什么一些听起来像运行时问题的东西会导致链接器错误?@Jester:我粗略地看了一下。这几乎与假设相似,即如果更改入口点,您就不再对C运行时感兴趣。删除入口点只会为入口点添加额外的选项,既不会添加链接器选项(我比较了它们之间的整个命令行),也不会添加C/C++编译器选项。这似乎是链接器的一些行为。
.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