我有两个函数需要直接在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.o。
但是,在编译所有代码时:
g++ -Wl,-s -Wl,-subsystem,windows -mthreads -o release\Test.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.o(at ../Test/asm.o),所以我不知道出了什么问题:(。
感谢您的帮助o /
顺便说一下:我正在使用MinGW的g ++(GCC)4.8.1,所以我在Windows环境中。
答案 0 :(得分:1)
链接器正在查找函数Func1()
,而不仅仅是符号名Func1
,因此它将查找与该函数的错位名称匹配的符号。您还没有定义任何此类符号,而是定义了Func1
,而没有错误的名称。
您需要在C ++文件中将函数声明为extern "C"
,以便链接器只查找您在asm中定义的Func1
。
答案 1 :(得分:0)
C ++编译器正在寻找名称受损的函数(带有调用参数类型)。
extern "C" int func1();
也许asm => _func1
。