我正在尝试静态编译一些东西,我正在尝试处理所有这些依赖项.我知道.dll文件是针对最终输出所需的动态链接依赖项,但是什么是.a和.lib文件,什么时候需要每个文件?
这可能是一个非常愚蠢的问题,但我不熟悉在Mac上进行开发,并且很难使用通用二进制文件.
我有一个我在QT Creator中编译的应用程序,根据lipo正在生成i386架构输出.据我了解,这意味着它正在生产Mac OS X 32位输出.
该应用程序依赖于两个外部库.我正在通过首先调用./config编译这些库中的一个,然后编译../config声明它是"为darwin-i386-cc配置".但是,运行make并在结果上调用lipo后,体系结构将报告为x86_64.
同样,我有另一个外部库.那个没有配置脚本,我只是通过调用make来编译它.这个的输出也是x86_64.
如何编译这两个外部库,以便它们生成与我的应用程序的i386输出兼容的东西?更好的是,我如何编译这两个外部库来生成通用库,这样我就可以从我的应用程序生成一个通用二进制文件,它可以在32位和64位上运行?
另外,基于Mac世界的当前状态,是否还有其他平台可以用来创建一个适当的,用户友好的Mac OS X通用二进制文件?
我有一些看起来像这样的代码,其中addr是一个sockaddr*:
struct sockaddr_in *sin = (struct sockaddr_in *) addr;
const char *IP=inet_ntoa(sin -> sin_addr);
Run Code Online (Sandbox Code Playgroud)
我相信这是使用Berkeley套接字的非常典型的代码.
但是,当我编译它时,我收到以下警告:
dereferencing pointer 'sin' does break strict anti-aliasing rules
在线搜索,我发现一些关于我正在做事的方式非常典型的事实的讨论,但这个编译器警告也是非常真实的并不是一件好事.
重做此代码以修复警告的正确方法是什么,而不仅仅是沉默它?
我即将在GPL下上传一个我一直在使用Sourceforge的项目,并希望得到一些关于如何以易于理解和使用的方式组织代码的建议.它,适用于git,以及Sourceforge呈现的方式.
我的项目是一个跨平台的C++应用程序,包括以下内容:
组织这个的最好方法是什么?
在我自己工作的时候,从项目根目录开始我就像这样:
/ LibPortion
/ GuiPortion
/ libs /开源库
/ libs /修改的开源库
/ libs/compiled /来保存已编译的库,包括编译Windows时的一些这不是来自开源库,例如Cygwin库文件
这是组织事物的明智方式吗?这符合惯例和期望吗?
在检查我的项目时,检查开源库以及项目的一部分是否有意义?我认为这样做是有意义的,因为这可以最大限度地减少摩擦,使项目设置并运行新的开发.当然我至少应该检查修改后的开源库.
另外,在编译库下包含在存储库中有什么意义?我认为最好告诉git忽略该目录并将其留空,因为它的内容在每个构建目标上都会有所不同,因为我的项目是跨平台的.
然而,对于那些不想为构建和/或下载所有库本身来提供为主要平台预编译的库而烦恼的人来说,这似乎也很不错.分享这些最聪明的方法是什么?我正在寻找Sourceforge,对我来说,如果不是作为我的git存储库的一部分,我应该如何分享这些内容并不是很明显.
我有一台OS X 10.6 Mac我用作我的开发机器.我编写的程序在开发机器上完美运行.但是,当我尝试在OS X 10.5上运行它(不确定是否相关)测试机器时,它会在启动时崩溃.
这是我得到的错误:
Process: MyApp[25908]
Path: /Applications/MyApp.app/Contents/MacOS/MyApp
Identifier: MyApp
Version: ??? (???)
Code Type: X86 (Native)
Parent Process: launchd [109]
Interval Since Last Report: 17392106 sec
Crashes Since Last Report: 735
Per-App Interval Since Last Report: 0 sec
Per-App Crashes Since Last Report: 8
Date/Time: 2010-08-14 07:50:09.768 -0700
OS Version: Mac OS X 10.5.8 (9L31a)
Report Version: 6
Anonymous UUID: 1BF30470-ACF2-46C7-B6D5-4514380965C8
Exception Type: EXC_BREAKPOINT (SIGTRAP)
Exception Codes: 0x0000000000000002, 0x0000000000000000
Crashed Thread: 0
Dyld Error Message:
Symbol …Run Code Online (Sandbox Code Playgroud) 我正在使用旧版本的OpenSSL,并且我遇到了一些在尝试使用跨平台代码时困扰了我好几天的行为.
我有代码调用OpenSSL来签名.我的代码是在ASN1_sign中的代码之后建模的,该代码可以在OpenSSL的a_sign.c中找到,当我使用它时会出现相同的问题.这是相关的代码行(在a_sign.c中找到并使用完全相同的方式):
EVP_SignUpdate(&ctx,(unsigned char *)buf_in,inl);
Run Code Online (Sandbox Code Playgroud)
ctx是OpenSSL使用的结构,与此讨论
无关buf_in是要签名的数据的char*inl是
buf_in的长度
可以重复调用EVP_SignUpdate,以便在调用EVP_SignFinal对其进行签名之前读入要签名的数据.
在Ubuntu和Windows 7上使用此代码时,一切正常,两者都会在给定相同输入的情况下生成完全相同的签名.
在OS X上,如果inl的大小小于64(即buf_in中有64个字节或更少),那么它也会产生与Ubuntu和Windows相同的签名.但是,如果inl的大小大于64,则会生成其自身内部一致的签名,这些签名与其他平台不同.通过内部一致,我的意思是Mac将读取签名并验证它们是正确的,而它将拒绝来自Ubuntu和Windows的签名,反之亦然.
我设法解决了这个问题,并通过将上面的行更改为以下内容来创建相同的签名,其中它一次读取一个字节的缓冲区:
int input_it;
for(input_it = (int)buf_in; input_it < inl + (int)buf_in; intput_it++){
EVP_SIGNUpdate(&ctx, (unsigned char*) input_it, 1);
}
Run Code Online (Sandbox Code Playgroud)
这导致OS X拒绝其自己的> 64字节数据的签名无效,并且我在其他地方跟踪了类似的行以验证需要以相同方式分解的签名.
这修复了签名的创建和验证,但是仍然存在问题,因为我遇到了其他问题,而且我真的不想更深入地了解(并修改!)OpenSSL.
当然我做错了,因为当我使用股票ASN1_sign时,我看到完全相同的问题.这是我编译OpenSSL的方式的问题吗?对于我的生活,我无法弄清楚.任何人都可以告诉我我必须犯的骨头错误吗?
我有一个跨平台的Qt应用程序,无论我如何调整UI,它总是在某些平台上看起来很好而在其他平台上看起来很糟糕,因为UI样式之间存在差异.
例如,边缘似乎是普遍设置的,即使底层元素的大小从一个平台急剧变化到另一个平台.
推荐的方法是什么?
我一直在阅读如下要求:如果在多线程应用程序中使用OpenSSL,则必须使用OpenSSL注册线程识别功能(以及互斥锁创建功能).
在Linux上,根据OpenSSL提供的示例,通常通过注册这样的函数来识别线程:
static unsigned long id_function(void){
return (unsigned long)pthread_self();
}
Run Code Online (Sandbox Code Playgroud)
pthread_self()返回一个pthread_t,这适用于Linux,因为pthread_t只是unsigned long的typedef.
在Windows pthreads,FreeBSD和其他操作系统上,pthread_t是一个结构体,具有以下结构:
struct {
void * p; /* Pointer to actual object */
unsigned int x; /* Extra information - reuse count etc */
}
Run Code Online (Sandbox Code Playgroud)
这不能简单地转换为unsigned long,当我尝试这样做时,它会抛出编译错误.我尝试将void*p转换为unsigned long,理论上内存指针应该在线程中保持一致且唯一,但这只会导致我的程序崩溃很多.
在使用Windows pthreads或FreeBSD或任何其他类似的操作系统时,我可以将OpenSSL注册为线程识别功能?
另外,作为一个额外的问题:
如果OpenSSL被编译并与QT一起使用,是否还需要知道是否需要这样做,如果是这样,如何在OpenSSL中注册QThreads?令人惊讶的是,我似乎无法在QT的文档中找到答案.
当我在我的C++代码上使用我的调试器(在我的特定情况下,它是QT Creator以及GDB启发了这一点)时,有时即使在调用make clean之后make调试器似乎也吓坏了.
有时它似乎与另一段代码的行号对齐,并会跳转.有时这是一条线,有时这完全是关闭的,它会不规律地跳转.
其他时候,它会因为踩到我没有要求它进入的事情而变得惊慌失措,就像踩过函数调用一样,它可能会进入作为其一部分的字符串初始化例程.
当我遇到seg故障时,有时它能够告诉我它在哪里完美发生,有时它甚至不能显示哪些函数称为代码的问号,从哪里开始,我所看到的就是汇编,即使在运行时也是如此重复相同的代码.
我似乎无法找出导致这些失败的模式,有时我的调试器表现得非常好.
这些调试器背后的理论原因是什么,以及我可以采取哪些具体步骤来防止它们?