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

时间:2015-10-06 21:25:15

标签: windows gcc compilation g++ mingw

我有两个函数需要直接在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环境中。

2 个答案:

答案 0 :(得分:1)

链接器正在查找函数Func1(),而不仅仅是符号名Func1,因此它将查找与该函数的错位名称匹配的符号。您还没有定义任何此类符号,而是定义了Func1,而没有错误的名称。

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

答案 1 :(得分:0)

C ++编译器正在寻找名称受损的函数(带有调用参数类型)。

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