Включить файл сборки * .o в проект Qt C ++ - PullRequest
2 голосов
/ 16 марта 2012

У меня есть проект Qt C ++.

Система
Windows XP
QtCreator и QtSDK новейшие
C ++
MinGW / gcc / g ++

Из соображений производительности мне нужно выполнить некоторые функции при сборке. Мой проект в основном Qt и c ++, но мне нужно связать мой код C ++ с какой-то сборкой, которую я написал. У меня есть файл сборки * .o, но я не могу получить доступ к своей функции сборки из моего кода C ++. Я собрал файл calc.o сборки с помощью nasm.

Упрощенный пример.

ПРОФИЛЬ

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

TRY # 1 - путь Карлфиллипа (не работает в 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 ]

2 голосов
/ 03 января 2017

Лучший способ, который я нашел для работы со сборкой в ​​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

Завершая, вы должны присвоить переменной NASM_SOURCES все файлы ASM, в моем случае это был только один файл с именем arregloAsm.asm

NASM_SOURCES += arregloAsm.asm

Я надеюсь, что все это работает и для вас!

0 голосов
/ 07 марта 2017

Сначала я сделал то, что упоминалось ранее:

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 "C" void test ();

в файл main.cpp.Обратите внимание на «С» в строке, потому что это была моя самая большая ошибка.(В случае языковых ошибок: я не являюсь носителем английского языка, если хотите, исправьте текст)

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

Почему вы не добавили calc.o в свои источники?

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

То же, что и до :

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!
...