我有两个函数需要直接在ASM上编写,因为GCC在编译这些函数时会包含前/后调用代码,我不希望这样。
假设不可变:我必须直接在asm上编译两个函数。
两个函数实现为:
.intel_syntax
.text
.globl Func1
.def Func1; .scl 2; .type 32; .endef
Func1:
push 1
push esp
mov eax, 0xDEADBEEF
call eax
ret
.globl Func2
.def Func2; .scl 2; .type 32; .endef
Func2:
ret
我正在使用:g++ -c asm生成对象。S -o - asm。o。这很有效!我有一个asm。0,无错误/警告
但是,当编译所有代码时:
g++ -Wl,-s -Wl,-subsystem,windows -mthreads -o releaseTest.exe ../Test/asm.o release/main.o release/mainwindow.o release/funcs.o release/qrc_a.o release/moc_mainwindow.o -lpsapi -lOleAut32 -lmingw32
我得到了以下错误:
release/funcs.o:funcs.cpp:(.text+0x5c4): undefined reference to `Func2()'
release/funcs.o:funcs.cpp:(.text+0x5d0): undefined reference to `Func1(HINSTANCE__*)'
release/funcs.o:funcs.cpp:(.text+0x6a5): undefined reference to `Func1(HINSTANCE__*)'
所以链接器找不到Func1和Func2对象…但我包括了asm。(在../Test/asm.o)编译,所以我不知道什么是错误的:(.
谢谢你的帮助/
顺便说一句:我使用g++ (GCC) 4.8.1从MinGW,所以我在Windows环境。
链接器正在查找函数Func1()
,而不仅仅是符号名称Func1
,因此它将查找与该函数的混乱名称匹配的符号。您没有定义任何这样的符号,而是定义了Func1
,没有一个混乱的名称。
您需要在c++文件中声明这些函数为extern "C"
,以便链接器只查找您在asm中定义的Func1
。
c++编译器正在寻找名字混淆的函数(调用参数类型)。
extern "C" int func1();
和asm => _func1
.