链接GCC(g++) ASM对象与.cpp对象不工作(对..的未定义引用)



我有两个函数需要直接在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 .

最新更新