我想使用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.
问题:
当从Linux主机交叉编译Qt for Windows之类的东西时,是否应该调用本机编译器?也就是说,在交叉编译过程中,我们不应该只使用交叉编译器吗?当我指定-xplatform选项时,我不明白为什么Qt的configure脚本会尝试调用我的系统的本机编译器.
如果我使用的是mingw交叉编译器,何时需要处理specs文件?GCC的规范文件对我来说仍然是一个谜,所以我想知道这里的一些背景是否对我有帮助.
一般来说,除了在我的qmake.conf中指定交叉编译器之外,我还需要考虑什么?
我希望有人可以解释linux内核源代码中使用的__user宏的细微差别.
首先,宏观:
# define __user __attribute__((noderef, address_space(1)))
Run Code Online (Sandbox Code Playgroud)
现在,经过一些谷歌搜索后,我读到这个宏允许一个指针指定属于用户地址空间,并且不应该取消引用它.
我可能会遗漏一些明显的事实,但有人可以解释这样一个宏的含义吗?例如,这个宏的使用位置有什么好的例子?如果我错过了一些明显的东西,请再次原谅我.
为了把它放在某些环境中,我在检查一些USB代码(linux/usbdevice_fs.h)时遇到了宏.我只是在寻找对内核中使用的这个宏(或其他类似的宏)的一般理解.
谢谢你的期待!
我有一个Python应用程序,它打开一个简单的TCP套接字,与另一个主机上的另一个Python应用程序通信.有时程序会出错或者我会直接杀死它,在任何一种情况下,套接字都可能会在未知时间内保持打开状态.
下次我运行程序时出现此错误:
socket.error: [Errno 98] Address already in use
Run Code Online (Sandbox Code Playgroud)
现在程序总是尝试使用相同的端口,因此它看起来好像仍处于打开状态.我查了一下,我很确定该程序没有在后台运行,但我的地址仍在使用中.
那么,我如何手动(或以其他方式)关闭套接字/地址,以便我的程序可以立即重新使用它?
更新
根据迈克的回答,我查看了socket(7)页面并查看了SO_REUSEADDR:
Run Code Online (Sandbox Code Playgroud)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 …
我正在看一个学校项目中的一些旧代码,并试图在我的笔记本电脑上编译它时遇到了一些问题.它最初是为旧的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位模式下无效,所以我有一种感觉手动推送所有寄存器可能不是一个好主意.
更新
在更多阅读之后,可以给出具有以下递归关系的解决方案:
(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问题,可以说明如何计算前几个数字.请告诉我如何改进这个问题.
如何检查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层时发生错误.在尝试操作之前,如何检查图层是否存在?
谢谢!
更新好吧,看起来在调用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) 我有一个GNU Radio应用程序,它使用Python和C++代码.我希望能够发出事件的C++代码信号.如果它们在相同的范围内,我通常会使用一个简单的布尔值,但代码与需要某种形式的共享内存的点是分开的.有问题的代码对性能至关重要,因此需要一种有效的方法.
我最初考虑的是Python和C++都可以访问的共享内存段.因此,我可以在python代码中设置一个标志,并从C++中检查它.由于我只需要一个简单的标志来暂停C++代码,信号量就足够了吗?
为了清楚起见,我需要从Python设置一个标志,C++代码将只检查这个标志,如果设置了,则进入一个繁忙的循环.
那么尝试在Python/C++之间实现共享内存段是一种合理的方法吗?信号量怎么样?在Linux上,哪个更容易实现?
谢谢!
我有一组汇编函数,我希望通过创建头文件在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) 在学校,我们一直使用引导程序来运行没有操作系统的独立程序.我一直在研究这个程序,当启用保护模式时,通过直接将操作码和操作数组合为程序中的数据来执行远程跳转.这是为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.
我也对最后两个字节的重要性感到困惑.然而,这似乎是另一个问题.现在已经很晚了,我一直盯着代码和英特尔手册几个小时,所以我希望我明白我的观点.
谢谢你的期待!