我正在寻找(并且肯定我不是唯一一个)在Windows上构建基于MinGW的64位Qt程序的最直接方式.直线向前意味着最小的努力和时间(例如,用于建造和设置).目前,我使用MinGW/OpenGL和QtCreator运行qt-project.org网站的常规官方开发环境,适用于Windows 32位.当然我已经阅读了qt-project.org的(未完成的...)64位维基页面,我也阅读了不同的stackoverflow问题,但我仍然感到困惑.我知道如何在其他帖子中处理如何构建64位Qt的主题,但这不是我的问题,我需要的是概述和最有利的64位MinGW端口.
让我感到困惑的一件事是,来自mingwbuilds sourceforge项目的"x64-Qt-5.2.1 + QTCreator-3.0.1-(gcc-4.8.2-seh).7z"包中的DLL似乎是32位.
为了澄清我的问题,我还要问一些相关的问题:
非常感谢你的帮助.
在嵌入式系统(2.4内核)中,我需要从不以root身份运行的进程对eth0接口进行原始套接字访问.
我尝试通过从命令行设置CAP_NET_RAW功能并使用cap_set_proc()以编程方式解决此问题,两者都没有成功.在我得到EPERM错误的程序中,似乎我没有权限这样做,在命令行上
无法在进程"1586"上设置上限:(不允许操作)
有没有更简单的方法来做我想要的?如果没有,成功设置CAP_NET_RAW功能需要哪些步骤?
编辑:我有root访问权限,但以root身份永久运行该进程是没有选择的.libcap的版本是1.10,没有'setcap'二进制文件,而是'setpcaps'.
编辑 - 回答George Skoptsov:
如果我说得对,你的建议是用setuid启动一个进程,然后设置CAP_NET_RAW功能,然后删除权限.我尝试使用以下代码,但它似乎不起作用,即使caps命令不返回错误.在seteuid()注释掉后,原始访问可以正常工作,但只有当进程以root身份运行时才会生效:
cap_t caps = cap_get_proc();
cap_value_t cap_list[1];
cap_list[0] = CAP_NET_RAW;
if (cap_set_flag(caps, CAP_EFFECTIVE, 1, cap_list, CAP_SET) == -1)
{
printf("cap_set_flag error");
}
if (cap_set_proc(caps) == -1)
{
printf("cap_set_proc error");
}
if (seteuid(getuid()) != 0)
{
printf("seteuid error");
}
function_that_needs_raw_access();
Run Code Online (Sandbox Code Playgroud)
谢谢你的帮助.克里斯
我有一个简单的测试bash脚本,看起来像这样:
#!/bin/bash
cmd="rsync -rv --exclude '*~' ./dir ./new"
$cmd # execute command
Run Code Online (Sandbox Code Playgroud)
当我运行脚本时,它也会复制以a结尾的文件,~即使我想要排除它们.当我直接从命令行运行相同的rsync命令时,它可以工作!有人知道为什么以及如何使bash脚本工作?
顺便说一句,我知道我也可以合作,--exclude-from但我想知道它是如何工作的.
在嵌入式 linux 环境(PowerPC 上定制的 2.4.25)中,几个小时后我得到以下内核恐慌:
Oops: kernel access of bad area, sig: 11
NIP: C9471C7C XER: 20000000 LR: C0018C74 SP: C0198E20 REGS: c0198d70 TRAP: 0800 Not tainted
MSR: 00009030 EE: 1 PR: 0 FP: 0 ME: 1 IR/DR: 11
DEAR: C9876FFF, ESR: 00000000
TASK = c0197020[0] 'swapper' Last syscall: 120
last math 00000000 last altivec 00000000
PLB0: bear= 0x48041040 acr= 0x00000000 besr= 0x00000000
PLB0 to OPB: bear= 0x00cc1000 besr0= 0x00000000 besr1= 0x00000000
GPR00: 00000000 C0198E20 C0197020 00000000 C016E494 000000C2 C01D0000 …Run Code Online (Sandbox Code Playgroud) 我用一个包含自定义构造函数,析构函数,复制构造函数和赋值运算符的示例类编写了一个小测试程序.当我意识到复制构造函数根本没有被调用时,我感到很惊讶,即使我实现了具有类的返回值和类似行的函数Object o1; Object o2(o1);
innerclass.hpp:
#include <iostream>
class OuterClass
{
public:
OuterClass()
{
std::cout << "OuterClass Constructor" << std::endl;
}
~OuterClass()
{
std::cout << "OuterClass Destructor" << std::endl;
}
OuterClass(const OuterClass & rhs)
{
std::cout << "OuterClass Copy" << std::endl;
}
OuterClass & operator=(const OuterClass & rhs)
{
std::cout << "OuterClass Assignment" << std::endl;
}
class InnerClass
{
public:
InnerClass() : m_int(0)
{
std::cout << "InnerClass Constructor" << std::endl;
}
InnerClass(const InnerClass & rhs) : m_int(rhs.m_int)
{
std::cout << …Run Code Online (Sandbox Code Playgroud) 我按照我发现的例子来使用QWinTaskbarProgress.我Qt Widgets Application在Qt Creator(Qt 5.3.1)中创建了一个标准,我mainwindow.cpp看起来像这样:
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
m_taskbarButton = new QWinTaskbarButton(this);
m_taskbarButton->setWindow(windowHandle());
m_taskbarButton->setOverlayIcon(style()->standardIcon(QStyle::SP_MediaPlay));
m_taskbarProgress = m_taskbarButton->progress();
m_taskbarProgress->setVisible(true);
m_taskbarProgress->setRange(0, 100);
m_taskbarProgress->setValue(50);
}
MainWindow::~MainWindow()
{
delete ui;
}
Run Code Online (Sandbox Code Playgroud)
我希望50%在启动应用程序后覆盖任务栏图标并显示进度条,但任务栏看起来很正常,就好像没有编写任何代码一样.我究竟做错了什么?
c++ ×2
linux ×2
qt ×2
64-bit ×1
bash ×1
kernel ×1
linux-kernel ×1
mingw ×1
powerpc ×1
qtwinextras ×1
raw-ethernet ×1
rsync ×1
sockets ×1
windows ×1