当使用Qt 5.5,qmake和MSVC 13来编译带有一些基本OpenGL函数调用的基本的样板Qt应用程序时,我得到以下链接器错误:
glwidget.obj:-1: error: LNK2019: unresolved external symbol __imp__glClear@4 referenced in function "public: virtual void __thiscall GLWidget::initializeGL(void)" (?initializeGL@GLWidget@@UAEXXZ)
glwidget.obj:-1: error: LNK2019: unresolved external symbol __imp__glClearColor@16 referenced in function "public: virtual void __thiscall GLWidget::initializeGL(void)" (?initializeGL@GLWidget@@UAEXXZ)
debug\OpenGLApp.exe:-1: error: LNK1120: 2 unresolved externals
Run Code Online (Sandbox Code Playgroud)
我有:
.pro文件:
QT += core gui opengl widgets
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets opengl
TARGET = OpenGLApp
TEMPLATE = app
CONFIG += windows
SOURCES += main.cpp\
mainwindow.cpp \
glwidget.cpp …Run Code Online (Sandbox Code Playgroud) 我使用预编译的Qt Installer Framework二进制文件2.0.1版为我的应用程序编写了一个安装程序.但是,安装程序窗口不会以任何可能的方式显示我的任何徽标.
有问题的徽标名为"installerlogo.png",一个带有alpha通道的64x64图像,位于安装程序目录结构的顶部(与config /和packages /目录所在的目录相同.)
我为了一个名为"installericon.ico"的图标制作了另一个徽标,这只是上面的16x16版本,只是重命名为".ico"(这是错误的方法吗?)
我在config.xml文件中尝试了以下内容:
<InstallerApplicationIcon>installericon</InstallerApplicationIcon>
<InstallerWindowIcon>installerlogo</InstallerWindowIcon>
<Logo>installerlogo.png</Logo>
<Background>installerlogo.png</Background>
Run Code Online (Sandbox Code Playgroud)
但没有一个产生任何视觉效果.
在修改程序集中编写bootsector代码之后,我想知道我是否可以在C中执行相同操作.到目前为止,空函数中的代码生成如下:
在C:
void _start() {
halt:
goto halt;
}
Run Code Online (Sandbox Code Playgroud)
随后的asm(由GCC生成):
7c00: 55 push %bp
7c01: 89 e5 mov %sp,%bp
7c03: eb fe jmp 0x7c03
Run Code Online (Sandbox Code Playgroud)
但是,是否可以指定对于此(入口)函数,我不希望初始化基本和堆栈指针?BIOS将控制权直接传输到0x7c00,因此设置堆栈指针的前两条指令是冗余的.
我已经尝试添加__attribute__ ((always_inline, noreturn, regparm(0)))到函数声明,但似乎没有做任何事情.
尝试使用基索引表达式在 16 位实模式下操作内存会导致编译错误:
movw $0xd000, -2(%sp)
movw $0, -4(%sp)
movw $1, -6(%sp)
Run Code Online (Sandbox Code Playgroud)
编译为
gcc -c -Wa,--32 $(DIR_BS_SRC)/mbr.S -o $(DIR_BS_SRC)/mbr.o
ld -nostdlib --oformat binary --Ttext 0x7c00 $(DIR_BS_SRC)/mbr.o -o $(DIR_B$
Run Code Online (Sandbox Code Playgroud)
产生以下错误:
bootsector/src/mbr.S:20: Error: `-2(%sp)' is not a valid base/index expression
bootsector/src/mbr.S:21: Error: `-4(%sp)' is not a valid base/index expression
bootsector/src/mbr.S:22: Error: `-6(%sp)' is not a valid base/index expression
Run Code Online (Sandbox Code Playgroud)
我认为这是有效的语法,即使在 16 位实模式下也是如此?
我有一个补丁,我想应用到我的本地树上。它是使用git format-patch. 它包含一些冲突,因此我使用以下内容来应用它:
$ git apply --3way mypatch.patch
这样,当我应用它时,我可以手动打开未能合并的文件。但是,一旦我这样做了,我想“完成”应用补丁——我的意思是,我想告诉 git“好吧,我已经完成了手动解决冲突——现在继续应用这个补丁补丁中的提交消息,以及补丁中指定的作者”。
然而,一旦出现合并冲突,git 就会放弃并将一切交给你。有没有办法告诉 git,“嘿,对于这个提交,请从这个补丁中获取提交信息和作者详细信息”?或者告诉 git,“您可以照常继续补丁应用程序”的方法?
我编写了一个Qt 5.5应用程序,它以QOpenGLWidget的形式使用OpenGL.现在我想要它,以便用户可以从应用程序中看到他们的设备信息.通过这个我的意思是:
到目前为止,我自己一直无法找到任何相关的功能.虽然我知道这可以通过调用OpenGL来完成,但我宁愿将所有代码保持在相对较高的水平.我从2004年发现这篇非常古老的文章说Qt没有这个功能,但也许有些时候已经改变了?
我有大量的常量,这些常量被越来越多的源文件使用.我需要能够玩它的价值,所以在一个地方定义它很方便.
我的情况的一个例子如下:
我定义变量的头文件rmode_loc.h:
#define __ASSEMBLER__
#define BSEQ_HI 0xF000
#define BSEQ_LO 0x0000
Run Code Online (Sandbox Code Playgroud)
我们(应该)使用的一些代码的摘录,myprog.S:
.code16
/* Include constants */
#include "rmode_loc.h"
_start:
...
push $BSEQ_HI
...
mov $BSEQ_LO, %bx
Run Code Online (Sandbox Code Playgroud)
但是,在尝试编译时,链接器会报告以下错误:
myprog.o: In function `_start':
(.text+0x1b): undefined reference to `BSEQ_HI'
myprog.o: In function `_start':
(.text+0x1f): undefined reference to `BSEQ_LO'
Run Code Online (Sandbox Code Playgroud)
显然正在尝试链接这些"符号" - 因此我得出结论,预处理器没有将符号替换为值所表示的值rmode_loc.h.
我读了另一个SO帖子(找不到链接),其中提到如果源文件的扩展名.s没有预处理会发生,并且__ASSEMBLER__还给出了定义的建议- 但是,这似乎不是在这里发布,因为所有的源都有.S扩展,我#define __ASSEMBLY__在标题中添加了一个.
然而,使用GCC作为前端进行编译时,即gcc myprog.S -o myprog,将BSEQ标签正确更换,一切编译.
我的问题是,在使用as而不是gcc产生这些结果时,预处理有什么区别,在使用gcc编译汇编代码时是否有任何重大的技术差异as?
以下代码是4:1多路复用器.如果dis信号为"1",则所有输出引脚上的输出应为0.是否有一种简洁的方式来表明如果dis为高,则输出应该为0,无论如何sel,而不必通过每个组合进行置换sel?
我知道在某些情况下,如果条件赋值不明确,则可能会出现意外的锁存器生成以及其他不希望的副作用.
architecture dataflow of mux8_4 is
begin
q <=d0 when sel = "00" and dis = '0' else
d1 when sel = "01" and dis = '0' else
d2 when sel = "10" and dis = '0' else
d3 when sel = "11" and dis = '0' else
"00000000" when sel = "00" and dis = '1' else
"00000000" when sel = "01" and dis = '1' else
"00000000" when sel …Run Code Online (Sandbox Code Playgroud) 我目前正在遵循启用GDT细分的指南.我正在使用GNU Assembler和Bochs进行仿真.
我知道我需要使用GDT描述符加载GDT寄存器.我已经完成了,接下来的步骤是将所有具有相对于GDT的偏移的段寄存器加载到代码/数据段描述符的各个位置.这样做的代码如下:
reloadSegments:
; Reload CS register containing code selector:
JMP 0x08:reload_CS ; 0x08 points at the new code selector
.reload_CS:
; Reload data segment registers:
MOV AX, 0x10 ; 0x10 points at the new data selector
MOV DS, AX
MOV ES, AX
MOV FS, AX
MOV GS, AX
MOV SS, AX
RET
Run Code Online (Sandbox Code Playgroud)
但是,我无法理解如何可以隐式加载具有偏移量的CS寄存器,而不会显着跳跃到CS:IP对指向的任何内存位置 - 即,如果代码段描述符位于GDT_start + 0x10,我尝试将0x10加载到CS寄存器,虚拟机跳转到0x10:IP,我从不输入.reload_CS标签.
我的例程版本(at&t语法):
_start:
// Disable interrupts
cli
// Load GDT register with location of GDT
lgdt 0x3c
// Load location of Code …Run Code Online (Sandbox Code Playgroud)