将 GCC(G++) ASM 对象与 .cpp 对象链接起来不起作用(对...的未定义引用)

Linking GCC(G++) ASM object with .cpp objects not working(undefined reference to...)

我有两个函数需要直接在 ASM 上编写,因为 GCC 在编译这些函数时会包含 pre/post 调用代码,而我不希望这样。

假设它是不可变的:我必须直接在 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 没有 error/warnning.

但是,当编译所有代码时:

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 环境中。

链接器正在寻找函数 Func1() 而不仅仅是符号名称 Func1,因此它将寻找与该函数的错位名称相匹配的符号。你还没有定义任何这样的符号,你已经定义了 Func1 而不是一个损坏的名字。

您需要在 C++ 文件中将函数声明为 extern "C",以便链接器只查找您在 asm.

中定义的 Func1

C++ 编译器正在查找名称错位的函数(具有调用参数类型)。

extern "C" int func1(); 也许 asm => _func1.