gpt4 book ai didi

c++ - 未解析的外部符号 C++ 与汇编程序

转载 作者:太空狗 更新时间:2023-10-29 20:39:38 25 4
gpt4 key购买 nike

我正在尝试在汇编程序中创建函数以在 C 中使用它。我的问题是我无法编译我的代码。我正在使用 Visual Studio 2012。我在构建自定义中添加了 masm,所以我不知道出了什么问题。C:

#include <stdio.h> 
int szukaj_max (int a, int b, int c);

int main()
{
int x, y, z, wynik;
printf("\nProszępodaćtrzy liczby całkowite: ");
scanf_s("%d %d %d", &x, &y, &z, 32);

wynik = szukaj_max(x, y, z);
printf("\nSpośród podanych liczb %d, %d, %d, \ liczba %d jest największa\n", x,y,z, wynik);

return 0;

程序集:

.686 
.model flat
public _szukaj_max
.code
_szukaj_max PROC
push ebp ; zapisanie zawartości EBP na stosie
mov ebp, esp ; kopiowanie zawartości ESP do EBP
mov eax, [ebp+8] ; liczba x
cmp eax, [ebp+12] ; porownanie liczb x i y
jge x_wieksza ; skok, gdy x >= y
; przypadek x < y
mov eax, [ebp+12] ; liczba y
cmp eax, [ebp+16] ; porownanie liczb y i z
jge y_wieksza ; skok, gdy y >= z
; przypadek y < z
; zatem z jest liczbąnajwiekszą
wpisz_z:
mov eax, [ebp+16] ; liczba z
zakoncz:
pop ebp
ret
x_wieksza:
cmp eax, [ebp+16] ; porownanie x i z
jge zakoncz ; skok, gdy x >= z
jmp wpisz_z
y_wieksza:
mov eax, [ebp+12] ; liczba y
jmp zakoncz
_szukaj_max ENDP

END

错误:

 Error  2   error LNK2019: unresolved external symbol "int __cdecl szukaj_max(int,int,int)" (?    szukaj_max@@YAHHHH@Z) referenced in function _main    C:\Users\Kaczor\Desktop\Ako\4.1\4.1\Source.obj
Error 3 error LNK1120: 1 unresolved externals C:\Users\Kaczor\Desktop\Ako\4.1\4.1\Debug\4.1.exe 1

最佳答案

包含函数调用的主文件的编译器假定它是一个 C++ 文件,例如因为文件名以“.cpp”结尾。因此,编译器将声明 int szukaj_max (int a, int b, int c); 解释为声明 C++ 函数。但是,您的汇编程序文件定义了一个 C 函数。

主要区别在于名称修改:为 C++ 函数生成的符号名称包含有关参数的信息,主要是为了便于链接器进行重载解析。因此,简单的符号 _szukaj_max 甚至都没有被查找过。 (我最初对错误消息中出现的 __cdecl 感到困惑,但它定义了 ABI 问题,例如参数传递的顺序、堆栈清理责任等,而不是名称修改。)

有关 Microsoft 所说的“修饰名称”的更多信息,请参阅 here.

解决方法:

  • 规范且可移植的方法是在主文件中声明函数“extern C”:
    extern "C"int szukaj_max(int a, int b, int c);
  • 按照编译器和链接器期望的方式命名函数。您可能可以手动将名称拼凑在一起,或者您只是查看链接器错误:您的名称是 ?szukaj_max@@YAHHHH@Z(没有前导下划线)。这是不可移植的,因为其他编译器有不同的约定。 (但是 MASM 汇编器可能也不是完全可移植的。)
  • 或者,如果您实际上是用 C 语言编程,请将主文件名的扩展名更改为“.c”,以便编译器假定所有声明的函数都是 C 函数(这是 Ange 的正确解决方案)。那应该又是便携的。

关于c++ - 未解析的外部符号 C++ 与汇编程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27215256/

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