我有一个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
答案 0 :(得分:2)
我发现在QT Creator中使用汇编的最好方法是配置.pro文件。我将 nasm 编译器添加到.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;在线,因为这是我最大的错误。 (如果语言错误:我没有以英语为母语的人,如果你愿意,请更正文字)