![](/img/trans.png)
[英]error LNK2019: unresolved external symbol referenced in function main
[英]error LNK2019: unresolved external symbol __imp____acrt_iob_func referenced in function _printf in VS2019
我正在使用 Visual Studio 2019 社區版,我正在嘗試從 C 程序運行程序集 function。
我收到以下錯誤:
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 ==========
我已經嘗試了幾乎所有可以在 inte.net 上找到的解決方案,但沒有任何效果,我希望有人可以深入了解正在發生的事情。
這是 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
鏈接到我的項目文件: https://drive.google.com/file/d/1entjG8nHarDTW0AEmvKhv0Cvrw9v0BF2/view?usp=sharing
我下載了您的項目並觀察到類似的 linker 錯誤(實際上我有更多錯誤)。 我查看了該項目的所有 linker 選項,注意加粗的條目。 粗體選項未被繼承。 一個突出的是Entrypoint
:
您使用 MASM function Reverser
覆蓋了默認的 C 啟動入口點。 我修改了EntryPoint
使其為空白(將其刪除)。 當我重建項目時,不再有 linker 錯誤。
你的Reverser
function 最后沒有ret
所以它會在運行時拋出異常。 我在Reverser
function 的底部添加了一個ret
並運行代碼並得到了這個 output:
注意:@rustyx 有很好的建議“在 MSVC 配置方面,嘗試每一種解決方案通常都是一個壞主意。事實上,應該非常小心,不要改變任何你不知道效果的東西。現在可能是值得的創建一個全新的項目。” . 如果您創建一個全新的CONSOLE項目並且不修改入口點,應該沒有問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.