小编Mr.*_*nce的帖子

如何为从Linux到Windows目标的交叉编译配置Qt?

我想使用Linux x86_64主机交叉编译用于Windows x86_64目标的Qt库(最终是我的应用程序).我觉得我很亲密,但我可能对这个过程的某些部分有一个根本的误解.

我首先在Fedora机器上安装所有mingw软件包,然后修改win32-g++qmake.conf文件以适应我的环境.但是,我似乎陷入了Qt的一些看似明显的配置选项:-platform-xplatform.Qt文档说-platform应该是主机机器架构(您正在编译的地方),并且-xplatform应该是您希望部署的目标平台.在我的情况下,我设置-platform linux-g++-64-xplatform linux-win32-g++其中的linux-Win32的克++是我的改性Win32的克++结构.

我的问题是,在使用这些选项执行configure后,我看到它调用我的系统编译器而不是交叉编译器(x86_64-w64-mingw32-gcc).如果我省略了该-xplatform选项并设置-platform为我的目标规范(linux-win32-g ++),它会调用交叉编译器,但是当它找到一些与Unix相关的函数时没有定义错误.

以下是我最新尝试的一些输出:http://pastebin.com/QCpKSNev.

问题:

  1. 当从Linux主机交叉编译Qt for Windows之类的东西时,是否应该调用本机编译器?也就是说,在交叉编译过程中,我们不应该使用交叉编译器吗?当我指定-xplatform选项时,我不明白为什么Qt的configure脚本会尝试调用我的系统的本机编译器.

  2. 如果我使用的是mingw交叉编译器,何时需要处理specs文件?GCC的规范文件对我来说仍然是一个谜,所以我想知道这里的一些背景是否对我有帮助.

  3. 一般来说,除了在我的qmake.conf中指定交叉编译器之外,我还需要考虑什么?

linux qt mingw cross-compiling

78
推荐指数
3
解决办法
7万
查看次数

linux __user宏有什么含义?

我希望有人可以解释linux内核源代码中使用的__user宏的细微差别.

首先,宏观:

# define __user         __attribute__((noderef, address_space(1)))
Run Code Online (Sandbox Code Playgroud)

现在,经过一些谷歌搜索后,我读到这个宏允许一个指针指定属于用户地址空间,并且不应该取消引用它.

我可能会遗漏一些明显的事实,但有人可以解释这样一个宏的含义吗?例如,这个宏的使用位置有什么好的例子?如果我错过了一些明显的东西,请再次原谅我.

为了把它放在某些环境中,我在检查一些USB代码(linux/usbdevice_fs.h)时遇到了宏.我只是在寻找对内核中使用的这个宏(或其他类似的宏)的一般理解.

谢谢你的期待!

c macros kernel linux-kernel

60
推荐指数
3
解决办法
2万
查看次数

如何关闭被杀死程序打开的套接字?

我有一个Python应用程序,它打开一个简单的TCP套接字,与另一个主机上的另一个Python应用程序通信.有时程序会出错或者我会直接杀死它,在任何一种情况下,套接字都可能会在未知时间内保持打开状态.

下次我运行程序时出现此错误:

socket.error: [Errno 98] Address already in use
Run Code Online (Sandbox Code Playgroud)

现在程序总是尝试使用相同的端口,因此它看起来好像仍处于打开状态.我查了一下,我很确定该程序没有在后台运行,但我的地址仍在使用中.

那么,我如何手动(或以其他方式)关闭套接字/地址,以便我的程序可以立即重新使用它?

更新

根据迈克的回答,我查看了socket(7)页面并查看了SO_REUSEADDR:

SO_REUSEADDR
    Indicates that the rules used in validating addresses supplied in a bind(2) call should
    allow reuse of local addresses.  For AF_INET sockets this means that a socket may bind,
    except when there is an active listening socket bound to the address.  When the listen?
    ing  socket is bound to INADDR_ANY with a specific port then it is not possible to bind
    to this port …
Run Code Online (Sandbox Code Playgroud)

python sockets linux networking tcp

38
推荐指数
3
解决办法
4万
查看次数

如何在x86_64上保存寄存器以获取中断服务程序?

我正在看一个学校项目中的一些旧代码,并试图在我的笔记本电脑上编译它时遇到了一些问题.它最初是为旧的32位版本的gcc编写的.无论如何,我试图将一些程序集转换为64位兼容代码并遇到一些障碍.

这是原始代码:

pusha
pushl   %ds
pushl   %es
pushl   %fs
pushl   %gs
pushl   %ss
Run Code Online (Sandbox Code Playgroud)

pusha在64位模式下无效.那么在64位模式下,在x86_64汇编中执行此操作的正确方法是什么?

必须有一个原因,为什么pusha在64位模式下无效,所以我有一种感觉手动推送所有寄存器可能不是一个好主意.

assembly x86-64 isr

24
推荐指数
4
解决办法
2万
查看次数

如何计算旅行推销员比特币之旅的最佳路径?

更新

在更多阅读之后,可以给出具有以下递归关系的解决方案:

(a) When i = 1 and j = 2, l(i; j) = dist(pi; pj )
(b) When i < j - 1; l(i; j) = l(i; j - 1) + dist(pj-1; pj)
(c) When i = j - 1 and j > 2, min 1<=k<i (l(k; i) + dist(pk; pj ))
Run Code Online (Sandbox Code Playgroud)

现在开始有意义了,除了C部分.我如何确定最小值k?我想这意味着你可以迭代所有可能的k值并只存储(l(k,i)+ dist(pk,pj)的最小结果?


是的,绝对是我在学校学习的一个问题.我们正在研究旅行商问题的比特旅游.

不管怎么说,我有5个顶点{0,1,2,3,4}.我知道我的第一步是按照增加x坐标的顺序对它们进行排序.从那里开始,我对动态编程如何完成这一点感到困惑.

我正在阅读我应该扫描已排序节点的列表,并维护两个部分(初始路径和返回路径)的最佳路径.我对如何计算这些最佳路径感到困惑.例如,我如何知道是否应该在初始路径或返回路径中包含给定节点,因为它不能同时包含(两个端点除外).回想一下斐波纳契的动态编程,你基本上从基础案例入手,继续前进.我想我要问的是如何开始使用比特型旅行推销员问题?

对于类似Fibonacci数字的东西,接近的动态编程非常清楚.但是,我不知道我是不是只是在密集或什么,但我很困惑试图绕过这个问题.

谢谢你的期待!

注意:我不是在寻找完整的解决方案,但至少有一些很好的技巧可以让我开始.例如,如果这是Fibonacci问题,可以说明如何计算前几个数字.请告诉我如何改进这个问题.

algorithm graph dynamic-programming

14
推荐指数
2
解决办法
1万
查看次数

如何检查scapy数据包中是否存在图层?

如何检查scapy数据包中是否存在特定图层?例如,我需要检查IP头的src/dst字段,我怎么知道特定的数据包实际上有一个IP头(例如与IPv6相反).

我的问题是,当我去检查IP头字段时,我得到一个错误,说IP层不存在.这个特定的数据包不是IP头,而是IPv6.

pkt = Ether(packet_string)
if pkt[IP].dst == something:
  # do this
Run Code Online (Sandbox Code Playgroud)

我尝试引用IP层时发生错误.在尝试操作之前,如何检查图层是否存在?

谢谢!

python scapy

12
推荐指数
2
解决办法
2万
查看次数

Python PyGILState_ {Ensure/Release}在从Python代码返回C++时导致段错误

更新好吧,看起来在调用PyGILState_Ensure()之前添加PyEval_InitThreads()就可以了.在我急于解决问题时,我错误地将我的"挂起"归因于PyEval_InitThreads().

但是,在阅读了一些Python文档后,我想知道这是否是正确的解决方案.

当未知哪个线程(如果有)当前具有全局解释器锁时,调用此函数是不安全的.


首先,我正在研究一些经过修改的GNU Radio代码 - 特别是修改过的gr_bin_statistics_f块.现在,有一个错误报告(虽然是一个旧报告)几乎描述了我的确切情况.

http://gnuradio.org/redmine/issues/show/199

现在,bug报告中提到的usrp_spectrum_sense.py调用gr_bin_statistics_f(C++),然后定期回调Python以重新调整USRP(无​​线电).

以下是调用Python代码时发生的情况:

PyGILState_STATE d_gstate;
d_gstate = PyGILState_Ensure();

// call python code

PyGILState_Release(d_gstate);
Run Code Online (Sandbox Code Playgroud)

因此,一旦我们从Python代码返回,当调用PyGILState_Release(d_gstate)时就会发生分段错误.虽然我的代码和原始的gr_bin_statistics_f之间存在差异,但似乎没有任何东西与此远程相关.

我读到在PyGILState_Ensure()之前调用PyEval_InitThreads()已经解决了一些人的问题,但它只是导致我的程序挂起.

任何人都可以为我阐明这一点吗?或者只是时候发送消息到GNU Radio邮件列表?

在Fedora 14 x86_64上使用Python2.7.

这是GDB的回溯:


(gdb) c
Continuing.
[New Thread 0x7fabd3a8d700 (LWP 23969)]
[New Thread 0x7fabd328c700 (LWP 23970)]
[New Thread 0x7fabd2a8b700 (LWP 23971)]
[New Thread 0x7fabd228a700 (LWP 23972)]
[New Thread 0x7fabd1a89700 (LWP 23973)]
[New Thread 0x7fabd1288700 (LWP 23974)]
[New Thread 0x7fabd0a87700 (LWP 23975)]
[New Thread 0x7fabbbfff700 (LWP 23976)]

Program received signal SIGSEGV, Segmentation fault.
[Switching to …
Run Code Online (Sandbox Code Playgroud)

c++ python multithreading gnuradio segmentation-fault

11
推荐指数
2
解决办法
4354
查看次数

Python和C++应用程序的简单但快速的IPC方法?

我有一个GNU Radio应用程序,它使用Python和C++代码.我希望能够发出事件的C++代码信号.如果它们在相同的范围内,我通常会使用一个简单的布尔值,但代码与需要某种形式的共享内存的点是分开的.有问题的代码对性能至关重要,因此需要一种有效的方法.

我最初考虑的是Python和C++都可以访问的共享内存段.因此,我可以在python代码中设置一个标志,并从C++中检查它.由于我只需要一个简单的标志来暂停C++代码,信号量就足够了吗?

为了清楚起见,我需要从Python设置一个标志,C++代码将只检查这个标志,如果设置了,则进入一个繁忙的循环.

那么尝试在Python/C++之间实现共享内存段是一种合理的方法吗?信号量怎么样?在Linux上,哪个更容易实现?

谢谢!

c++ python linux ipc

11
推荐指数
2
解决办法
1万
查看次数

如何编译用于C程序(GNU汇编程序)的程序集例程?

我有一组汇编函数,我希望通过创建头文件在C程序中使用它.例如,如果我有定义实际汇编例程的asm_functions.s和asm_functions.h,它们具有函数原型以及我需要的一些标准#define.我的目标是使用C程序,比如test_asm.c来调用程序集函数.

asm__functions.h:


 #define ASM_CONST_1    0x80
 #define ASM_CONST_2    0xaf

uint8_t asm_foo( int, int, int );

asm__functions.s:


 /* dont need this: #include "asm_functions.h" */

.section .text .type asm_foo, @function asm__foo: /* asm code with proper stack manipulation for C calling conventions */ ret

test__asm.c:


 #include "asm_foo.h"

int main() { uint8_t res = asm_foo( 1, 2, 3); return 0; }

在这种情况下,编译链接程序的正确方法是什么?我正在尝试这样的事情:


gas -o asm_foo.o asm_foo.s
gcc -o test_asm test_asm.c

但我仍然从GCC得到一个链接器错误,说我的程序集例程未定义.我希望这个人为的例子足以解释这种情况.

谢谢!

编辑:

使用单个命令编译时,这是一个输出片段:


tja@tja-desktop:~/RIT/SP2/latest$ gcc -o test_pci pci_config.s test_pci.c
/tmp/ccY0SmMN.o: In function _pci_bios_read_byte': …
Run Code Online (Sandbox Code Playgroud)

x86 assembly linker compilation

9
推荐指数
1
解决办法
3万
查看次数

有人可以解释这个直接组装的x86 JMP操作码吗?

在学校,我们一直使用引导程序来运行没有操作系统的独立程序.我一直在研究这个程序,当启用保护模式时,通过直接将操作码和操作数组合为程序中的数据来执行远程跳转.这是为GNU汇编程序:


         /* this code immediately follows the setting of the PE flag in CR0 */

.byte   0x66, 0xEA
.long   TARGET_ADDRESS
.word   0x0010          /* descriptor #2, GDT, RPL=0 */
Run Code Online (Sandbox Code Playgroud)

首先,为什么要这样做(而不是指令助记符)?

我一直在看英特尔的手册,但我仍然对代码感到困惑.特别是在第2A卷第3-549页,有一个操作码表.相关条目:

EA *cp* JMP ptr16:32  Inv.  Valid  Jump far, absolute, address given in
operand

实际的操作码是显而易见的,但是第一个字节0x66让我感到困惑.参考英特尔手册中的表格,cp显然意味着将遵循一个6字节的操作数.显然,在接下来的两行中会有6个字节.0x66编码'操作数大小覆盖前缀'.这与表中的cp有什么关系?我原以为cp会有一些十六进制值,而是有这个覆盖前缀.有人可以帮我清楚一下吗?

这是od的转储:

c022    **ea66    0000    0001    0010**    ba52    03f2    c030

TARGET_ADDRESS定义为0x00010000.

我也对最后两个字节的重要性感到困惑.然而,这似乎是另一个问题.现在已经很晚了,我一直盯着代码和英特尔手册几个小时,所以我希望我明白我的观点.

谢谢你的期待!

x86 assembly gnu opcode protected-mode

8
推荐指数
1
解决办法
6314
查看次数