设置Qt Creator的用于链接和编译汇编代码(Setting up Qt Creator for

2019-09-29 23:00发布

我一直在学习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

构建设置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:.CODE组件PROC

mov rax, 1234
ret
xor rax, rax

assembly endp
end

编辑: 附加构建

Answer 1:

该代码应该是这样的(在你的亲文件)。 所述第一编译器(NASM)生成从该ASM文件中LST文件。 第二编译器(nasm_ld)然后运行LD以生成目标文件。

对于NASM编译器, ASM_FILES是输入变量,它从读出,并且将产生的LST到的名称LST_FILES ,它是由nasm_ld的处理,并且该对象加入到OBJECTS ,应使可用于接头。

nasm.name = nasm ${QMAKE_FILE_IN}
nasm.input = ASM_FILES
nasm.variable_out = OBJECTS
nasm.commands = nasm -f win64 ${QMAKE_FILE_IN} -o ${QMAKE_FILE_OUT}
nasm.output = ${QMAKE_VAR_OBJECTS_DIR}${QMAKE_FILE_IN_BASE}$${first(QMAKE_EXT_OBJ)}
nasm.CONFIG += target_predeps

QMAKE_EXTRA_COMPILERS  += nasm

ASM_FILES += asm.s

编辑:我已经更新基础上的评论代码。 试试,如果这个工程。 它应该编译ASM文件和目标文件添加到链接。 请先删除您的自定义生成步骤。



Answer 2:

我能够编译64位MSVC 2017使用我的亲文件下列ASM文件。 注:我是建设使用MDD和MD CXX标志,这样我可以静我的图书馆链接到另一个项目,但在亲文件应该能够正常运行的底部的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


文章来源: Setting up Qt Creator for linking and compiling assembly code