Проект Qt C ++ с не встроенной сборкой - PullRequest
3 голосов
/ 16 марта 2012

Я использую Windows XP и Newest Qt Creator с QtSDK и встроенным компилятором gcc.

Вопрос в том, как использовать полную сборку в C ++ Qt Project.Я знаю, как использовать встроенную сборку, но я не знаю, как сделать полную сборку не встроенную (записанную в отдельном файле .asm) в проекте Qt C ++.

Возможно ли это с помощью QtПроект C ++, и если да, то как?

РЕДАКТИРОВАТЬ:

* pro file

TEMPLATE = app
CONFIG += console
CONFIG -= qt

SOURCES += \
    calc.S

calc.S

section .data
        hello: db 'Hello world!', 10
        helloLen: equ $-hello

section .text
        global _start

_start:
        mov eax, 4
        mov ebx, 1
        mov ecx, hello
        mov edx, helloLen
        int 80h

proexit:
        mov eax, 1
        mov ebx, 0
        int 80h

Ошибки компиляции

..\plain_cpp\calc.S: Assembler messages:
..\plain_cpp\calc.S:1: Error: no such instruction: `section .data'
..\plain_cpp\calc.S:2: Error: no such instruction: `db 72ello world!4410'
..\plain_cpp\calc.S:3: Error: no such instruction: `equ $-hello'
..\plain_cpp\calc.S:5: Error: no such instruction: `section .text'
..\plain_cpp\calc.S:6: Error: no such instruction: `global _start'
..\plain_cpp\calc.S:9: Error: too many memory references for `mov'
..\plain_cpp\calc.S:10: Error: too many memory references for `mov'
..\plain_cpp\calc.S:11: Error: too many memory references for `mov'
..\plain_cpp\calc.S:12: Error: too many memory references for `mov'
..\plain_cpp\calc.S:13: Error: junk `h' after expression
..\plain_cpp\calc.S:13: Error: suffix or operands invalid for `int'
..\plain_cpp\calc.S:16: Error: too many memory references for `mov'
..\plain_cpp\calc.S:17: Error: too many memory references for `mov'
..\plain_cpp\calc.S:18: Error: junk `h' after expression
..\plain_cpp\calc.S:18: Error: suffix or operands invalid for `int'

РЕДАКТИРОВАНИЕ 2 - Стиль AT & T

Файл PRO

TEMPLATE = app
CONFIG += console
CONFIG -= qt

SOURCES += \
    calc.S

calc.S

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

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

    ret

ОШИБКИ

undefined reference to `WinMain@16'
collect2: ld returned 1 exit status

Ответы [ 3 ]

2 голосов
/ 16 марта 2012

В то время как метод @ karlphillip в целом верен, вы должны иметь в виду некоторые вещи, указанные в Windows:

  1. При компиляции @ karlphillip В коде вы получите сообщение об ошибке компоновщика, выданное MinGw стандартным библиотечным файлом:

    c:/mingw/bin/../lib/gcc/mingw32/4.6.1/../../../libmingw32.a(main.o): In function `main':
    C:\MinGW\msys\1.0\src\mingwrt/../mingw/main.c:73: undefined reference to `WinMain@16'
    

    Это не ваш main, а главный libmingw32.a.И он ожидает WinMain как точку входа вашего кода.Дело в том, что WinMain является точкой входа по умолчанию для приложения Windows, определенного Microsoft.libmingw32.a определяет фактическую основную часть, которая вызывается из фактической точки входа.Это главное делает некоторые вещи, а затем звонит WinMain.Но вы не определили WinMain, очевидно.

    В этом простом примере вам на самом деле не нужна стандартная библиотека, тогда вы можете удалить стандартную библиотеку и скомпилировать приведенный выше код с командной строкой

    gcc -Wl,-subsystem,console 1.S -nostdlib
    

    Она должна быть эквивалентной настройке Qt QMAKE_CXXFLAGS+=-nostdlib

    Затем код выше компилируется, и ... segfaults .Затем перейдите к пункту 2:

  2. int 80h - это конкретный системный вызов linux.Кажется, это не работает на окнах.Вы должны вызвать WriteConsole в Windows для записи в stdin.Но в качестве «доказательства концепции» вы можете запустить следующий код:

    .text
    .globl  main
    main:
        movl $1, %eax
    ret
    

    Это установит код выхода программы на 1.

РЕДАКТИРОВАТЬ Если вам нужен пример Hello world , скомпилированный со стандартной библиотекой, вы можете попробовать это:

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

.text
.global _WinMain@16
_WinMain@16:
    push $hello
    call _puts
    add $4, %esp

    ret

Скомпилировать с gcc 1.S

1 голос
/ 16 марта 2012

Я предлагаю вам прочитать этот урок , чтобы правильно настроить Qt Creator для сборки.

EDIT:

Ваша проблема в том, что qmake вызовет gcc для компиляции вашего кода сборки, и вы используете Intel Syntax . Вам необходимо преобразовать код сборки для использования синтаксиса AT & T :

calc.S

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

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

    ret

calc.pro

TEMPLATE = app
CONFIG += console
CONFIG -= qt

SOURCES += \
    calc.S

Вставьте эти 2 файла в один и тот же каталог, затем выполните qmake, а затем make.

Выход:

$ ./calc 
Hello World
0 голосов
/ 16 марта 2012

Вы пробовали SOURCES += yourfile.asm в вашем * .pro файле?

...