【问题标题】:Setting up Qt Creator for linking and compiling assembly code设置 Qt Creator 以链接和编译汇编代码
【发布时间】:2017-12-10 04:02:23
【问题描述】:

过去几周我一直在学习 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

主窗口.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

【问题讨论】:

  • 没有成功。您可能知道如何为我的项目正确格式化这些定义吗?编辑:QMAKE_FILE_IN — 这是输入文件名,带路径这是否意味着我必须用文件名 + 路径替换 QMAKE_FILE_IN?
  • github.com/Skycoder42/QtRestClient/blob/master/mkspecs/features/… 为例。 REST_API_CLASSES 将是项目文件的变量。如果您仍然有问题,我可以使用代码为您的问题创建一个完整的答案,但不会在明天之前......
  • @Felix 仍然无法正常工作。这是该项目的下载链接:mega.nz/#!31dDGTLJ!V-D2EytdyON1-56d4J7FOOCt_DJLawj4xDttxl6N1QE 感谢您提供帮助
  • 在 Windows 上,您需要使用前导下划线来装饰外部符号,因此在您的程序集文件中使用 _assembly 而不是 assembly。这就解释了 Windows 上的链接错误。

标签: c++ qt assembly nasm qmake


【解决方案1】:

代码应如下所示(在您的 pro 文件中)。第一个编译器 (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

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

【讨论】:

  • 谢谢,关于如何调整编译器命令的任何建议?我无法获得任何汇编
  • 我从没用过汇编程序,所以不知道。试着让你在命令行上工作,阅读一些关于如何使用 nasm 的教程。编译器命令基本上就是您在控制台上键入的内容,文件名由这些变量替换
  • 嗯,恐怕,我似乎找不到合适的教程。 ahm.. 还是我必须用实际文件替换 ASM..FILESLST..FILESOBJECTS(因为这些是变量)
  • 不在 pro 文件中。如果您在命令行上尝试它,是的(即尝试nasm -f elf -g -F stabs asm.s asm.lst 在命令行上是否有效。
  • 哇,搞定了。但是使用masm(不是nasm)。如果发生任何商业用途,那将是一个问题。我注意到语法在某些方面有所不同。 ui-&gt;label.... 变成了`ui.label...` 和label 被标记为错误,即使它编译得很好。添加新对象有点华丽,但我可以忍受。无论如何,非常感谢!
【解决方案2】:

我能够为我的 pro 文件使用以下内容来编译带有 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-30
    相关资源
    最近更新 更多