将程序集* .o文件包含到Qt C ++项目中

时间:2012-03-16 18:24:37

标签: c++ qt assembly qt-creator

我有一个Qt C ++项目。

系统
Windows XP
QtCreator和QtSDK最新的 C ++
MinGW / gcc / g ++

出于性能原因,我需要在汇编中完成一些功能。我的项目主要是Qt和c ++,但我需要将我的C ++代码链接到我写的一些程序集。我有一个程序集* .o文件但我无法从我的c ++代码访问我的汇编函数。我用nasm编译了程序集calc.o文件。

简化示例。

专业文章

QT       += core
QT       -= gui

TARGET = Test_asm
CONFIG   += console
CONFIG   -= app_bundle

TEMPLATE = app
LIBS += C:/Users/David/Test_asm/calc.o

SOURCES += main.cpp

的main.cpp

#include <QtCore/QCoreApplication>
#include <QTextStream>

extern "C" int five();

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QTextStream qout(stdout);

    int f = five();

    qout << "five: " << f << endl;

    return a.exec();
}

错误

main.cpp:11: undefined reference to `five'
collect2: ld returned 1 exit status

尝试#1 - Karlphillip的方式(在Windows上不起作用)

 Directory of C:\x

16/03/2012  03:09 PM    <DIR>          .
16/03/2012  03:09 PM    <DIR>          ..
16/03/2012  03:07 PM                82 calc.pro
16/03/2012  03:10 PM               178 calc.S
16/03/2012  03:10 PM               164 main.c
               3 File(s)            424 bytes
               2 Dir(s)  78,905,851,904 bytes free

C:\x>qmake

C:\x>make
'make' is not recognized as an internal or external command,
operable program or batch file.

C:\x>mingw32-make
mingw32-make -f Makefile.Debug
mingw32-make[1]: Entering directory `C:/x'
gcc -c -g -Wall -DUNICODE -DQT_LARGEFILE_SUPPORT -I"..\QtSDK\Desktop\Qt\4.7.3\mi
ngw\mkspecs\default" -o debug\main.o main.c
gcc -c -g -Wall -DUNICODE -DQT_LARGEFILE_SUPPORT -I"..\QtSDK\Desktop\Qt\4.7.3\mi
ngw\mkspecs\default" -o debug\calc.o calc.S
g++ -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-rel
oc -Wl,-subsystem,console -mthreads -Wl -o debug\calc.exe debug/main.o debug/cal
c.o
debug/main.o: In function `main':
C:\x/main.c:9: undefined reference to `helloasm'
collect2: ld returned 1 exit status
mingw32-make[1]: *** [debug\calc.exe] Error 1
mingw32-make[1]: Leaving directory `C:/x'
mingw32-make: *** [debug] Error 2

4 个答案:

答案 0 :(得分:2)

我发现在QT Creator中使用汇编的最好方法是配置.pro文件。我将 nasm 编译器添加到.pro文件和一些标志。如果需要,您可以更改这些标志。但是这个配置适合我

example.pro

QMAKE_EXTRA_COMPILERS += nasm
NASMEXTRAFLAGS = -f elf64 -g -F dwarf
OTHER_FILES += $$NASM_SOURCES
nasm.output = ${QMAKE_FILE_BASE}.o
nasm.commands = nasm $$NASMEXTRAFLAGS -o ${QMAKE_FILE_BASE}.o ${QMAKE_FILE_NAME}
nasm.input = NASM_SOURCES

完成后,你必须为所有ASM文件分配 NASM_SOURCES 变量,在我的例子中它只是一个,它叫做 arregloAsm.asm

NASM_SOURCES += arregloAsm.asm

我希望这一切对你也有用!

答案 1 :(得分:0)

before相同:

<强> calc.S

.data
hello:
    .string "Hello World\n"

.globl  helloasm
helloasm:
    movl $4, %eax
    movl $1, %ebx
    movl $hello,%ecx
    movl $12,%edx
    int $0x80

    ret

<强>的main.c

#include <stdio.h>

void helloasm();

int main()
{
    printf("* Calling ASM function:\n");

    helloasm();

    printf("* Done!\n");

    return 0;
}

<强> calc.pro

TEMPLATE = app
CONFIG += console
CONFIG -= qt

SOURCES += main.c \
    calc.S

将所有这些文件放在同一目录中后,执行:

qmake
make

验证输出:

$ ./calc 
* Calling ASM function:
Hello World
* Done!

答案 2 :(得分:0)

为什么不将calc.o添加到您的来源?

答案 3 :(得分:0)

我先做了前面提到的事情:

<强> testasm.pro

QT += core
QT -= gui

CONFIG += c++11

TARGET = testasm
CONFIG += console
CONFIG -= app_bundle

TEMPLATE = app

SOURCES += main.cpp

# The following define makes your compiler emit warnings if you use
# any feature of Qt which as been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

QMAKE_EXTRA_COMPILERS += nasm
NASMEXTRAFLAGS = -f elf64 -g -F dwarf
OTHER_FILES += $$NASM_SOURCES
nasm.output = ${QMAKE_FILE_BASE}.o
nasm.commands = nasm $$NASMEXTRAFLAGS -o ${QMAKE_FILE_BASE}.o ${QMAKE_FILE_NAME}
nasm.input = NASM_SOURCES

NASM_SOURCES += test.asm

<强>的main.cpp

#include <QCoreApplication>

extern "C" void test();

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    test();
    return a.exec();
}

<强> TEST.ASM

global test

bits 64
section .text

test:
    mov rax,0
    ret

在菜单Build中单击build all,应该运行应用程序。它在这个例子中是一个空终端,但在我的系统上它可以工作。 我正在寻找解决方案,感谢这篇文章,我终于有了一个。 只记得添加

  

extern &#34; C&#34; void test();

到你的main.cpp文件。注意&#34; C&#34;在线,因为这是我最大的错误。 (如果语言错误:我没有以英语为母语的人,如果你愿意,请更正文字)