设置Qt Creator以链接和编译汇编代码

时间:2017-07-06 08:45:47

标签: c++ qt assembly nasm qmake

我在过去几周一直在学习C ++和x64汇编,并希望使用Qt IDE进行GUI编程。问题是我找不到链接和编译包含汇编代码的文件的方法。我一直在浏览互联网和这个网站而没有找到任何帮助。

这是我到目前为止所尝试的内容: 的.pro

QMAKE_CXXFLAGS += -save-temps
QT       += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = test---
TEMPLATE = app
DEFINES += QT_DEPRECATED_WARNINGS

QMAKE_EXTRA_COMPILERS += nasm

SOURCES += main.cpp\
    mainwindow.cpp\
    asm.s

HEADERS  += mainwindow.h
FORMS    += mainwindow.ui

mainwindow.cpp

//code
extern "C" __int64 assembly();

//code

void MainWindow::on_pushButton_clicked()
{
    int zahl = assembly(); // place what the assembly function return into "zahl"
}

asm.s

.code
.global
assembly proc

mov rax, 1
ret

xor rax, rax

assembly endp
end

Build setup img

尝试编译项目会导致以下错误消息:

mainwindow.obj:-1: Fehler: LNK2019: unresolved external symbol assembly referenced in function "private: void __cdecl MainWindow::on_pushButton_clicked(void)" (?on_pushButton_clicked@MainWindow@@AEAAXXZ)

我还为控制台应用程序找到了一个关于此的设置指南。但它似乎不适合GUI应用程序:http://dvisagie.blogspot.de/2011/09/setting-up-qt-creator-for-assemblylinux.html

以下是我在Visual Studio中编译程序集文件的方法: 的.cpp:

#include "stdafx.h"
#include<iostream>

using namespace std;

extern "C" __int64 _stdcall assembly();

int main()
{
    cout << assembly() << endl;

    system("pause");
    return 0;
}

.ASM:     。码     汇编过程

mov rax, 1234
ret
xor rax, rax

assembly endp
end

编辑:appended build

2 个答案:

答案 0 :(得分:1)

代码应如下所示(在您的专业文件中)。第一个编译器(nasm)从asm文件生成lst文件。然后第二个编译器(nasm_ld)运行ld以生成目标文件。

对于nasm编译器, var slideIndex = 1; var length = $(".tile").length; $( "#right" ).click(function() { if(slideIndex != 1){ $( ".tile" ).animate({ "left": "+=365px" }, "1000" ); slideIndex--; } }); $( "#left" ).click(function() { if(slideIndex >= length-1 ){ }else{ $( ".tile" ).animate({ "left": "-=365px" }, "1000" ); slideIndex++; } }); 是它从中读取的输入变量,并将生成的lst的名称写入ASM_FILES,该名称由nasm_ld处理,并且对象添加到{{ 1}},它应该为链接器提供。

LST_FILES

编辑:我已根据评论更新了代码。试试这是否有效。它应该编译asm文件并将目标文件添加到链接器。请先删除自定义构建步骤。

答案 1 :(得分:0)

我可以使用以下prom文件使用asm文件编译64位MSVC 2017。 注意:我正在使用MDd和MD cxx标志构建静态库,以便可以将库静态链接到另一个项目,但是pro文件底部的ASM部分仍然可以正常工作。

TEMPLATE = lib
TARGET = mystaticlib
INCLUDEPATH += .
CONFIG -= qt
CONFIG += staticlib
CONFIG -= debug_and_release debug_and_release_target
LIBS += -lws2_32

QMAKE_CXXFLAGS_DEBUG += /MDd
QMAKE_CXXFLAGS_RELEASE += /MD

win32: DESTDIR = ./

OBJECTS_DIR = ./.obj

HEADERS += myheader.h

SOURCES += mysource.cpp

#add additional compiler for asm source using MS 2017 macro assembler 64 bit
ml64.name = ML64 ${QMAKE_FILE_IN}
ml64.input = ASM_FILES
ml64.variable_out = OBJECTS
ml64.commands = ML64 /c ${QMAKE_FILE_NAME} /Fo ${QMAKE_FILE_OUT}
ml64.output = ${QMAKE_VAR_OBJECTS_DIR}${QMAKE_FILE_IN_BASE}$${first(QMAKE_EXT_OBJ)}
ml64.CONFIG += target_predeps

QMAKE_EXTRA_COMPILERS  += ml64

ASM_FILES += \
      myx64.asm
相关问题