导航:首页 > 源码编译 > lean编译环境

lean编译环境

发布时间:2022-12-07 01:57:35

❶ 100分.Tricks of the Windows Game Programming Gurus的第一个程序的编译问题. 只要解决问题了分不是问题.

没有编程经验 如何做游戏编程
作者:David Astle

经常有人问我,没有编程经验的人该如何开始开发游戏。在此之前,我总是一个个的尽力回答。然而,后来提相同问题的人数增长到难以处理的地步。我决定,是时候把我所有的建议写成文章,作为一个大概。

这篇文章是针对那些想要开发自己游戏,但几乎没有编程经验的人。事实上,我假设读者没有任何编程经验。我主要讨论游戏开发的程序和设计方面,而不是艺术性。我也不准备讲述如何进入游戏行业(这方面已经有足够的资料),而只是让你逐步的开始开发自己的游戏。最后,我所指出的这条道路也并不能作为唯一的,或是最好的路径来学习开发游戏,但至少对我和一些人很有用。

选择一门语言

你要做的第一件事就是选择一门开发语言。你有很多选择,包括Basic,Pascal,C,C++,Java,等等。也经常会有人争论对于初学者那一门语言是最好的。对于这一系列流行语言的讨论,你可以参看John Hattan的着作,What Language Do I Use?(我用什么语言?)

我的建议是以C和C++开始。有些人会说这些语言对初学者来说太高级了,但因为我自己就是学C++,我并不同意这一说法。而且,C/C++是当今使用最广泛的语言(译者认为应该是汉语。。。),所以你可以找到大量学习资料和帮助。你先学C或C++都无所谓,因为只要学了一个,再学另外一个就很容易。但是,如果你先学C++,请保证在学习面向对象编程之前能理解和使用过程编程(等编程熟练再去学习类)。(译者:C是过程性语言,C++是面向对象语言)

如果你开始学习C/C++,发现太难,那再学一个简单一点的也没关系,比如Basic或Pascal。但是我真的认为,如果你坚持努力,而且有好的资料,学C/C++应该没有太大问题。

你的下一个问题可能会是:“我该怎么学C/C++?”我很高兴你这样问。最好的办法是上课。有老师可以回答你的问题,帮助你产生很大进步,编程练习作业也可以保证你能用到所学的东西。

如果你不觉得上课是个好主意,那最好的办法就是买一些好书。不要花太多时间去选一本什么“超级宝典”或“万用全书”,因为你最终可能会买几本。我建议你去一家书店,然后拿几本比较入眼的C或C++书看,直到找到一本或几本你能看懂,并且可以拿来学习的。同时,你可能会想要一些更深入的,或者一些材料,但是你一旦对于这门语言有了一些了解,我相信你应该有自己更好的选择。

在这里,我有必要花一些时间,来说我看到很多初学者所关心的一个事情,特别是年轻人:没有钱买书和其他东西。首先,有很多免费资源可以利用,图书馆,Macmillan Computer Publishing(),有成千上百的编程书籍。但是如果你真的想要成为一个好的程序员,还是应该投入一部分资金。应当想方设法(合法的)帮助你弄到一些钱。

网上也有很多C/C++的学习指南。但是我认为那只能作为补充而不是你自学的主要资源。

选择正确的编译器

你写的程序,或者代码,是以文本方式储存的,你甚至可以用记事本写C/C++程序。但是总需要有东西把他们转换成为可执行文件。对于C和C++,那就是编译器。

可用的编译器有好多种,包括很多免费的。选择一款自己适合的编译器很重要,免费的编译器就有这样的好处,你可以把它们试个遍,然后从中选择自己最喜欢的。然而,免费编译器比起商业版,可能会缺失一些功能和大部分服务。幸运的是,多数商业版编译器也兼售介绍版或学习版,这要便宜得多,通常功能却不见得少,唯一的限制是你不能发布用它编译的程序(短时间内你也根本用不着)。

总之,选择编译器取决于你能花多少钱,用什么操作系统,和为什么平台开发。如果要为windows开发,我强烈推荐Microsoft Visual C++。他强大的开发环境使得很多事做起来更方便,毫无疑问没有其他编译器更适合开发windows应用程序。如果你是个学生,你还可以折价买到。如果你在DOS平台开发,你最好的选择可能是DJGPP,免费的哦~。

选择开发平台

尽管最终你很可能为好几个平台开发,总要先选择一个来学。当你在学这门语言,还没有接触到图像的时候,你可能会想使用非图形用户界面的操作系统,比如DOS,Unix.这样可以避免接触高层,比如windows编程,让你集中精力学习语言本身。

一旦你做好开发游戏的准备,那么,应该考虑是否改变平台,让我们来看看每个选项的特征。

windows:如果你想成为游戏行业的专家,或者如果你想让许多人来玩你开发的游戏,那么,这就是你要选择的平台。因为多数你的用户使用windows,而且现在我也看不出有什么改变的迹象。当今大多数的windows游戏都是由一种你可能听说过技术---DirectX---开发的。你可以DirextX这个库直接访问硬件,这意味着你可以开发高性能的游戏。

DOS:DOS过去是占统治地位的游戏平台,但是已经一去不复返了。尽管可能有一些特殊爱好者还在为DOS开发游戏,现在没有一个为DOS开发的商业游戏,他也将继续衰落,直到微软不再支持。如果你只是想开发游戏,还是不要选择DOS,如果你非要这么做,也不要太久。记住:由于存在大量DOS游戏开发的书,可能还有人辩护从这些书中学习DOS游戏开发。但是,windows游戏开发的书越来越多,那些辩解也变得越来越无力。

Linux:Linux是Unix的一种,由于很多原因后来变得流行,包括稳定性,价格,和反微软情绪。尽管Linux用户还是相当少,但是围绕着他的热情和不断增长的市场潜力使其也成为不错的选择。

Macintosh:MAC有大量忠实粉丝并不能说明什么,几乎每一个和我讨论的MAC狂热者都需要更多更好的游戏。我没有见过多少MAC游戏开发资源,但我相信还是有的,因此这也是一个选择。

consoles:console(就是PS,N64,DC等等)的游戏市场十分巨大,当然console游戏开发的前景也不错。然而以非商业的形式开发console游戏,出于各种原因,在现在似乎行不通。如果你开发console,很可能是在被商业游戏开发组雇用之后。

开始进入主题

现在是时候讨论开发游戏了。简单起见,我假设你选择用C/C++在windows平台开发,可能你选择别的,但大多数我说的还是有用的。

首先,甚至在你打算开始开发游戏之前,你必须很好掌握C和C++.你应该懂指针,数组,结构体,函数,可能还有类。如果你精通他们,就可以开始做游戏了。

这篇文章可能不能教会你所有关于开发游戏的东西。幸运的是,也没有这个必要。这方面有很多书,网上也有很多指南。GameDev.net应该有所有你想要的东西,这里我建议你怎么开始:

找一本或几本书。对于windows游戏开发初学者,Tricks of the Windows Game Programming Gurus是个完美的开始。除此之外,还有许多好书.读透这些书,试试所有的例子,不懂得部分多读几遍。

网上指南作为补充。除了弄清书上读到的,他们还涉及一些书上没有谈及的主题。

向专家寻求帮助。如果你不能在书上或指南找到问题的答案,好好利用我们的论坛和聊天室。那里有好多专家愿意帮助别人。

这并不是要你按照顺序执行的,而是可以同时并且不断的重复执行。

光学习还是不够的,你必须运用你所学到的。从一个小游戏开始,然后在这个基础上前进。你可以看一下Geoff Howland's 的着作: How do I Make Games? A Path to Game Development.

开始,自己独立工作。不要急着加入团队,那样只会减缓学习过程。而且一旦你有了自己的几个游戏,你可以为团队做出更大的贡献。

还有关于书,你应该不仅仅看游戏开发的书。为了能够开发出你看到商店出售的游戏,你应该钻研比大多数游戏开发书籍更高级的一些主题。有一些可以在网上找到,但你也应该选一些图形学,人工智能,网络,物理学等方面的书。计算机科学学位看来唾手可得,但因为你被迫上这些课的时候可能认为他们和游戏开发无关----你错了!

这里有一些提示很有用

不要只积累知识,用它

你永远不会知道会理解一些东西知道你是用他们。用你学的东西作些演示。做作书上的练习。

多玩游戏

这样做会使你做出更好的游戏。而且可以减轻编程的枯燥。

帮助别人

能帮别人的地方尽量帮助别人,教别人的过程中自己会学到更多。

有始有终

不要有这样的想法:“我能够完成这个游戏了,但是我又有一个新的想法,那就直接做下一个。”你可以学得更多如果你完成他,你也可以用事实证明你不是只会空谈。所以,尽量不要做很大很复杂的游戏,直到你有了一定经验。

开始吧!你现在可以开始准备QUAKE4了。可能你不是不是很了解,但是至少应该知道如何开始这条道路,找多些资料,加上多年努力工作,他一定会实现!

❷ 关于#include "stdafx.h"的问题,

说实话,以下内容是拷贝来的,简单点说,stdafx.h文件是作为Visual Studio编译32位的程序时固定创建的一个头文件,也就是你可以自己写一个来用。网上的代码不可能把这些小地方也拷贝上去。如果不太清楚内容的话可以先新建一个win32 console application 工程,把里面Visual Studio创建的stdafx.h文件拷贝过来就行了。。。

-------------------------------------------------------
Standard Application Fram Extend
没有函数库,只是定义了一些环境参数,使得编译出来的程序能在32位的操作系统环境下运行。

Windows和MFC的include文件都非常大,即使有一个快速的处理程序,编译程序也要花费相当长的时间来完成工作。由于每个.CPP文件都包含相同的include文件,为每个.CPP文件都重复处理这些文件就显得很傻了。
为避免这种浪费,AppWizard和VisualC++编译程序一起进行工作,如下所示:
◎AppWizard建立了文件stdafx.h,该文件包含了所有当前工程文件需要的MFCinclude文件。且这一文件可以随被选择的选项而变化。
◎AppWizard然后就建立stdafx.cpp。这个文件通常都是一样的。
◎然后AppWizard就建立起工程文件,这样第一个被编译的文件就是stdafx.cpp。
◎当VisualC++编译stdafx.cpp文件时,它将结果保存在一个名为stdafx.pch的文件里。(扩展名pch表示预编译头文件。)
◎当VisualC++编译随后的每个.cpp文件时,它阅读并使用它刚生成的.pch文件。VisualC++不再分析Windowsinclude文件,除非你又编缉了stdafx.cpp或stdafx.h。
这个技术很精巧,你不这么认为吗?(还要说一句,Microsoft并非是首先采用这种技术的公司,Borland才是。)在这个过程中你必须遵守以下规则:
◎你编写的任何.cpp文件都必须首先包含stdafx.h。
◎如果你有工程文件里的大多数.cpp文件需要.h文件,顺便将它们加在stdafx.h(后部)上,然后预编译stdafx.cpp。
◎由于.pch文件具有大量的符号信息,它是你的工程文件里最大的文件。
如果你的磁盘空间有限,你就希望能将这个你从没使用过的工程文件中的.pch文件删除。执行程序时并不需要它们,且随着工程文件的重新建立,它们也自动地重新建立。
--------------------------------------------

❸ 问几个c++调试时的错误提示

1.编译器错误 C2447
错误消息
“{”: 缺少函数标题(是否是老式的形式表?)

在全局范围内出现左大括号,但没有相应的函数头。
此错误可能由旧式 C 语言格式列表引起。
下面的示例生成 C2447:
// C2447.cpp
int c;
{} // C2447

2. 编译器错误 C2181
错误消息
没有匹配 if 的非法 else

每个 else 都必须具有一个与之相匹配的 if。

下面的示例生成 C2181:
// C2181.cpp
int main() {
int i = 0;
else // C2181
i = 1;
}

可能的解决方案:
// C2181b.cpp
int main() {
int i = 0;
if(i)
i = 0;
else
i = 1;
}

3.编译器错误 C2057
错误消息
应输入常数表达式

上下文要求常数表达式,即其值在编译时已知的表达式。

示例
下面的示例生成 C2057:
// C2057.cpp
int i;
int b[i]; // C2057
int main() {
const int i = 8;
int b[i];
}

C 对常数表达式有限制性更强的规则。下面的示例生成 C2057:
// C2057b.c
#define ArraySize1 10
int main() {
const int ArraySize2 = 10;
int h[ArraySize2]; // C2057
int h[ArraySize1]; // OK
}

4.编译器错误 C2065

错误消息
“identifier”: 未声明的标识符

在可使用变量的类型前必须在声明中指定它。在可以使用函数前必须在声明或原型中指定该函数使用的参数。

可能的原因:

您正在用 C 运行库的调试版本进行编译,在 for 循环中声明标准 C++ 库迭代器变量,然后尝试在 for 循环范围外使用该迭代器变量。 用 C 运行库的调试版本编译标准 C++ 库代码暗指使用 /Zc:forScope。 有关更多信息,请参见调试迭代器支持。

可能正在调用当前不受生成环境支持的 SDK 头文件中的函数。

省略必要的包含文件,尤其是在定义 VC_EXTRALEAN、WIN32_LEAN_AND_MEAN 或 WIN32_EXTRA_LEAN 时。这些符号从 windows.h 和 afxv_w32.h 中排除了一些头文件以加快编译。(在 windows.h 和 afxv_w32.h 中查找排除的头文件的最新说明。)

标识符名拼写错误。

标识符使用了错误的大小写字母。

字符串常数的后面缺少右引号。

命名空间范围不正确。例如,若要解析 ANSI C++ 标准库函数和运算符,则必须用 using 指令指定 std 命名空间。下面的示例未能编译,因为 using 指令被注释掉,并且在 std 命名空间中定义了 cout:

❹ 什么是JIT

准时生产方式(Just In Time简称JIT),是日本丰田汽车公司在20世纪60年代实行的一种生产方式,1973年以后,这种方式对丰田公司渡过第一次能源危机起到了突出的作用,后引起其它国家生产企业的重视,并逐渐在欧洲和美国的日资企业及当地企业中推行开来,现在这一方式与源自日本的其它生产、流通方式一起被西方企业称为“日本化模式”,其中,日本生产、流通企业的物流模式对欧美的物流产生了重要影响,近年来,JIT不仅作为一种生产方式,也作为一种通用管理模式在物流、电子商务等领域得到推行。
在20世纪后半期,整个汽车市场进入了一个市场需求多样化的新阶段,而且对质量的要求也越来越高,随之给制造业提出的新课题即是,如何有效地组织多品种小批量生产,否则的话,生产过剩所引起的只是设备、人员、非必须费用等一系列的浪费,从而影响到企业的竞争能力以至生存。在这种历史背景下,1953年,日本丰田公司的副总裁大野耐一综合了单件生产和批量生产的特点和优点,创造了一种在多品种小批量混合生产条件下高质量、低消耗的生产方式即准时生产。准时制指的是,将必要的零件以必要的数量在必要的时间送到生产线,并且只将所需要的零件、只以所需要的数量、只在正好需要的时间送到生产。这是为适应20世纪60年代消费需要变得多样化、个性化而建立的一种生产体系及为此生产体系服务的物流体系。
[编辑本段]
【准时制核心思想】
在准时制生产方式倡导以前,世界汽车生产企业包括丰田公司均采取福特式的“总动员生产方式”,即一半时间人员和设备、流水线等待零件,另一半时间等零件一运到,全体人员总动员,紧急生产产品。这种方式造成了生产过程中的物流不合理现象,尤以库存积压和短缺为特征,生产线或者不开机,或者开机后就大量生产,这种模式导致了严重的资源浪费。丰田公司的准时制采取的是多品种少批量、短周期的生产方式,实现了消除库存,优化生产物流,减少浪费目的。
准时生产方式基本思想可概括为“在需要的时候,按需要的量生产所需的产品”,也就是通过生产的计划和控制及库存的管理,追求一种无库存,或库存达到最小的生产系统。准时生产方式的核心是追求一种无库存的生产系统,或使库存达到最小的生产系统。为此而开发了包括“看板””在内的一系列具体方法,并逐渐形成了一套独具特色的生产经营体系。
准时制生产方式以准时生产为出发点,首先暴露出生产过量和其他方面的浪费,然后对设备、人员等进行淘汰、调整,达到降低成本、简化计划和提高控制的目的。在生产现场控制技术方面,准时制的基本原则是在正确的时间,生产正确数量的零件或产品,即时生产。它将传统生产过程中前道工序向后道工序送货,改为后道工序根据“看板”向前道工序取货,看板系统是准时制生产现场控制技术的核心,但准时制不仅仅是看板管理。
[编辑本段]
【对生产制造的影响】
1.生产流程化
即按生产汽车所需的工序从最后一个工序开始往前推,确定前面一个工序的类别,并依次的恰当安排生产流程,根据流程与每个环节所需库存数量和时间先后来安排库存和组织物流。尽量减少物资在生产现场的停滞与搬运,让物资在生产流程上毫无阻碍地流动。
“在需要的时候,按需要的量生产所需的产品”。对于企业来说,各种产品的产量必须能够灵活地适应市场需要量的变比。众所周知,生产过剩会引起人员、设备、库存费用等一系列的浪费。避免这些浪费的手段就是实施适时适量生产,只在市场需要的时候生产市场需要的产品。
为了实现适时适量生产,首先需要致力于生产的同步化。即工序间不设置仓库,前一工序的加工结束后,使其立即转到下一工序去,装配线与机械加工几乎平行进行。在铸造、锻造、冲压等必须成批生产的工序,则通过尽量缩短作业更换时间来尽量缩小生产批量。生产的同步化通过“后工序领取”这样的方法来实现。 “后工序只在需要的时间到前工序领取所需的加工品;前工序中按照被领取的数量和品种进行生产。”这样,制造工序的最后一道即总装配线成为生产的出发点,生产计划只下达给总装配线,以装配为起点,在需要的时候,向前工序领取必要的加工品,而前工序提供该加工品后,为了补充生产被领走的量,必向再前道工序领取物料,这样把各个工序都连接起来,实现同步化生产。
这样的同步化生产还需通过采取相应的设备配置方法以及人员配置方法来实现。即不能采取通常的按照车、铣、刨等工业专业化的组织形式,而按照产品加工顺序来布置设备。这样也带来人员配置上的不同作法:弹性配置作业人数。降低劳动费用是降低成本的一个重要方面,达到这一目的的方法是“少人化”。所谓少人化,是指根据生产量的变动,弹性地增减各生产线的作业人数,以及尽量用较少的人力完成较多的生产。这里的关键在于能否将生产量减少了的生产线上的作业人员数减下来。具体方法是实施独特的设备布置,以便能够在需求减少时,将作业所减少的工时集中起来,以整顿削减人员。但这从作业人员的角度来看,意味着标准作业中的作业内容、范围、作业组合以及作业顺序等的一系列变更。因此为了适应这种变更,作业人员必须是具有多种技能的“多面手”。
2.生产均衡化
生产均衡化是实现适时适量生产的前提条件。所谓生产的均衡化,是指总装配线在向前工序领取零部件时应均衡地使用各种零部件,生产各种产品。为此在制定生产计划时就必须加以考虑,然后将其体现于产品生产顺序计划之中。在制造阶段,均衡化通过专用设备通用化和制定标准作业来实现。所谓专用设备通用化,是指通过在专用设备上增加一些工夹具的方法使之能够加工多种不同的产品。标准作业是指将作业节拍内一个作业人员所应担当的一系列作业内容标准化。
生产中将一周或一日的生产量按分秒时间进行平均,所有生产流程都按此来组织生产,这样流水线上每个作业环节上单位时间必须完成多少何种作业就有了标准定额,所在环节都按标准定额组织生产,因此要按此生产定额均衡地组织物质的供应、安排物品的流动。因为JIT生产方式的生产是按周或按日平均,所以与传统的大生产、按批量生产的方式不同,JIT的均衡化生产中无批次生产的概念。
标准化作业是实现均衡化生产和单件生产单件传送的又一重要前提。丰田公司的标准化作业主要是指每一位多技能作业员所操作的多种不同机床的作业程序,是指在标准周期时间内,把每一位多技能作业员所承担的一系列的多种作业标准化。丰田公司的标准化作业主要包括三个内容:标准周期时间、标准作业顺序、标准在制品存量,它们均用“标准作业组合表”来表示。
3.资源配置合理化
资源配置的合理化是实现降低成本目标的最终途径,具体指在生产线内外,所有的设备、人员和零部件都得到最合理的调配和分派,在最需要的时候以最及时的方式到位。
从设备而言,设备包括相关模具实现快速装换调整,例如,丰田公司发明并采用的设备快速装换调整的方法是SMED法。丰田公司所有大中型设备的装换调整操作均能够在10分钟之内完成,这为“多品种、小批量”的均衡化生产奠定了基础。
在生产区间,需要设备和原材料的合理放置。快速装换调整为满足后工序频繁领取零部件制品的生产要求和“多品种、小批量”的均衡化生产提供了重要的基础。但是,这种颇繁领取制品的方式必然增加运输作业量和运输成本,特别是如果运输不便,将会影响准时化生产的顺利进行。合理布置设备,特别是U型单元连结而成的“组合U型生产线”,可以大大简化运输作业,使得单位时间内零件制品运输次数增加,但运输费用并不增加或增加很少,为小批量频繁运输和单件生产单件传送提供了基础。
人员而言,多技能作业员(或称“多面手”)是指那些能够操作多种机床的生产作业工人。多技能作业员是与设备的单元式布置紧密联系的。在U型生产单元内,由于多种机床紧凑地组合在一起,这就要求并且便于生产作业工人能够进行多种机床的操作,同时负责多道工序的作业,如一个工人要会同时操作车床、铣床和磨床等。
[编辑本段]
【人力资源准时制方式的必要性】
实现人力资源的准时制至少可以给企业带来以下3个方面的好处:
1.减少人员维护成本。企业对内部员工不但要长期支付工资、福利等成本,而且要不断投入培训费用以提高和维持员工的各项技能。使用准时制人员,虽然可能一次性支出较大,但从长远观点看能节省很多成本。
2.不断吸收外部信息。通过准时制方式随时吸引外部人才的加入,能加强企业与外部的交流,及时取得各种有价值的信息,尤其是一些技术发展趋势方面的情况,往往从其他渠道难以得到。
3.集中力量于核心职能。实践证明,"大而全,小而全"的企业结构是效率低下的,目前出现的虚拟化管理的趋势,就是要把企业内部的部分职能逐渐分离出来,由社会或其他组织承担,从而使企业把非核心因素排除在企业组织之外,集中力量于企业的战略核心环节。我国进行的企业剥离部分社会职能、高校后勤社会化等一系列改革都体现了这种要求。
【人力资源准时制方式的可行性】
在计划经济体制下,人力资源管理的准时制方式是绝不可能实现的,但是随着市场经济的深入发展,准时制方式已成为可能,并且将发展成为一种常用的重要的方式。
1.随着人才市场的发展和完善,人员流动性增强,人才素质提高,从而对外部人才的可获性增强。烽火猎头认为众多的猎头公司、人才中心、咨询公司等都是可以利用的渠道,通过与这些公司的长期广泛联系,企业可以在需要的时候很容易地得到需要的人才,使准时制成为可能。尤其在我国,劳动力资源丰富的特点为企业采用准时制方式提供了资源保障。
2.用人制度的改革为JIT的实施提供方便。企业与个人之间新型的劳动合同关系消除了终身制的种种弊端,使得企业在用人方面拥有更大的主动性和灵活性。通过签订劳动合同,企业可以决定员工的聘用、待遇、绩效以及辞退等问题,也可以事先确定员工的服务时间,从而保证了准时制的顺利实施。
3.从国外经验看,准时制在人力资源管理中有着广泛的应用。在国外,早已出现的人才租赁公司为企业聘用准时制人员提供了帮助。据统计,美国约有20%的中小企业都采用人才租赁的方式,而人才租赁正是准时制一种主要方式。
[编辑本段]
【准时制人员的对象】
按照准时制的基本思想,企业中的任何人员都可能成为准时制管理的对象,只要企业出现人员需要,就要做到准时制。根据企业中各类人员的特点和作用,我们可以把准时制管理的对象分为两大类:
1.企业迫切需要的核心人员。一般来讲,企业的核心人员包括决策人员、管理人员、研究开发人员以及业务开发人员等等。这些核心人员决定了企业的综合竞争力,对于企业的生存和发展起着关键性的作用,他们是企业不可或缺的力量。因此,如果需要这部分人员,就必须及时补充,做到Just In Time.比如,由于业务扩展或人事变动,企业急需业务开发人员,人力资源管理部门就应当做到使所需人员及时到位,否则,将影响企业业务的开展。
有人认为,企业核心人员是企业的中坚力量,不应属于"随叫随到"的准时制人员。这是对准时制本质认识不清的结果,准时制要求在需要的时候提供需要的人员,并不涉及这种需要的时间长短。既然出现了对核心人员的需要,就应当使核心人员准时到位。尽管这类人员是企业长期需要的,而且也相对稳定,但其最初加入企业应当是Just In Time.
2.企业暂时需要的人员。这类人员虽然不构成企业的核心力量,但是他们的可获性将直接影响企业各项工作的顺利进行。这类人员可以是一些急需的专门人才,如产品开发人才、项目开发人才,因为这类人才只为特定产品或项目服务,企业没有必要长期拥有,因此可采用准时制方式临时雇佣,尤其对于一些中小企业,自身的技术力量不强,不能吸引或保留高层次技术人才,通过准时制方式获取外部人才将是一种理想的选择。另外,企业暂时需要的人员也可能是一些临时性或季节性工作要求的辅助人员,比如偶尔出现的货物运输、季节性的工作量增加,都需要使用准时制人员。由于这部分人员类型多、变动频繁,因此进行准时制开发的工作量相对较大,必须有科学详尽的准时制人员规划。
[编辑本段]
【准时制人员的规划】
准时制技术的一个重要特点就是严格的计划,为了适时地满足企业对人员的需要,同时又要消除人员的闲置,即不能靠大量"库存"来满足变动的需求,必须做好准时制人员的规划。一般应根据行业的商业周期或季节性规律,科学预计企业业务的发展变化对人员需求的影响,尤其是对临时需要人员的影响。
规划中,首先要确定准时制人员可能担任的工作清单,清单内容包括工作说明,工作所需的技能、知识,工作所需的方法、工具、设备,工作的质量要求,工作所需的培训时间及鉴定合格的标准等。然后根据工作清单,采取各种方式如提前招聘、租赁、兼职、顾问等,预先约定准时制人员,一旦需要就立即通知他们前来工作。如果是短期人力需求,工作结束后相应的准时制人员也结束临时聘用。
为保证准时制人员规划的顺利实施,应当建立详细的人才资源信息库,记录所有可以利用的外部人力资源,比如兼职人员、转换工作中的人士、精力充沛的退休人员、可以租赁的人才、自由职业者等等,并保持与这些人员的长期联系。人才库应当包括人员的特点、技能、爱好、联系方式、薪资要求等方面的信息,以便为企业预约准时制人员提供参考。
在人力资源开发与管理工作中,准时制既是一种技术,更是一种思想。它要求人力资源管理部门着眼于企业实际需要,周密计划、严格控制,既不能出现人员短缺,也不能有人员的闲置,这是一项非常困难而又很有意义的工作。
【准时制人员的供应商管理模式】
准时制对于供应商的管理需求为零库存计划,要求供应商生产物料严格按照订单生产,通过这种方式减少供应商的库存成本及浪费。从整个供应链上面体现出“零库存”的概念。
[编辑本段]
JAVA领域的JIT
JIT Compiler(Just-in-time Compiler) 即时编译
最早的Java建置方案是由一套转译程式(interpreter),将每个Java指令都转译成对等的微处理器指令,并根据转译后的指令先后次序依序执行,由于一个Java指令可能被转译成十几或数十几个对等的微处理器指令,这种模式执行的速度相当缓慢。
针对这个问题,业界首先开发出JIT(just in time)编译器。当Java执行runtime环境时,每遇到一个新的类别(class:类别是Java程式中的功能群组),类别是Java程式中的功能群组-JIT编译器在此时就会针对这个类别进行编译(compile)作业。经过编译后的程式,被优化成相当精简的原生型指令码(native code),这种程式的执行速度相当快。花费少许的编译时间来节省稍后相当长的执行时间,JIT这种设计的确增加不少效率,但是它并未达到最顶尖的效能,因为某些极少执行到的Java指令在编译时所额外花费的时间可能比转译器在执行时的时间还长,针对这些指令而言,整体花费的时间并没有减少。
基于对JIT的经验,业界发展出动态编译器(dynamic compiler),动态编译器仅针对较常被执行的程式码进行编译,其余部分仍使用转译程式来执行。也就是说,动态编译器会研判是否要编译每个类别。动态编译器拥有两项利器:一是转译器,另一则是JIT,它透过智慧机制针对每个类别进行分析,然后决定使用这两种利器的哪一种来达到最佳化的效果。动态编译器针对程式的特性或者是让程式执行几个循环,再根据结果决定是否编译这段程式码。这个决定不见得绝对正确,但从统计数字来看,这个判断的机制正确的机会相当高。事实上,动态编译器会根据“历史资料”做决策,所以程式执行的时间愈长,判断正确的机率就愈高。以整个结果来看,动态编译器产生的程式码执行的速度超越以前的JIT技术,平均速度可提高至50%。
JIT 页面渲染引擎
JIT 页面渲染是 COMSHARP CMS 为了实现网站内容即时更新而开发的页面生成技术,JIT页面渲染引擎直接从数据库获取网站最新内容,瞬间生成页面输出给访问者,并通过 URL 转写技术实现纯静态地址。JIT 页面渲染技术是针对传统 CMS 生成静态 HTML 文件而言。传统 CMS 由于使用脚本代码模板技术,页面生成前,需要将数据库中的页面内容用外部模板进行解析与渲染,导致严重的性能问题,为了解决这个问题,传统 CMS 一般采用生成 HTML 静态文件技术,即,在内容创作完成后,对全站的内容执行一个静态 HTML 文件生成过程,最终,全站内容以静态 HTML 文件的形式存在。
静态 HTML 文件技术最显着的优势是性能出众,然而这种技术最严重的问题在于,用户对站点任何修改与更新,必须首先经过一次全站 HTML 文件重新生成过程,然后才能被访问者看到。根据不同 CMS 产品的性能和站点规模,这个 HTML 生成过程可能长到十几分钟到几十分钟或更长。也有个别 CMS 产品使用触发式页面渲染模式,即内容更新后,并不立即生成 HTML 文件,而是在用户第一次访问该页面时,触发生成该页面的 HTML 文件,这种技术的问题在于,用户第一次访问被更新页面的时候,可能经历非常漫长的等待,因为站点内各个页面之间并非孤立的,他们可能相互引用,虽然访问的只是一个页面,为了对引用页面同步更新,需要重新生成 HTML 文件的页面可能有多个。
JIT 页面渲染如何工作?
下图,是 COMSHARP CMS JIT 渲染引擎与传统 CMS 生成 HTML 静态页面模式对比。可以看出,JIT 渲染引擎直接将网站最新内容从数据库渲染给访问用户,而传统 CMS 的站点内容在到达访问用户之前,首先要经历一个 HTML 的转换过程。
COMSHARP CMS JIT 页面渲染如何实现毫秒级的渲染速度?
COMSHARP CMS 在页面渲染的时候,JIT 引擎可以在数十毫秒的时间内容完整整个页面的生成,这样就保证用户访问的时候,不会因 JIT 渲染造成延迟。事实上,COMSHARP CMS 网站访问速度只取决于服务器带宽,页面生成过程带来的延迟可以忽略不计。
我们有两项技术保证这样的性能:
编译级主题模板
COMSHARP CMS 的编译级主题模板直接内嵌在系统的 DLL 中,主题模板的套用是在运行时(Run Time)完成,这和传统 CMS 的调用脚本代码模板解释运行是截然不同。
调用 .NET 核心函数完成页面渲染(绕开 ASP.NET Webform 生命周期)
我们知道,.NET 框架内核性能是非常出色的,然而,ASP.NET Webform 却以效率低下而受到诟病。ASP.NET Webform 效率低下的主要原因,是微软为了在 Web 上实现类似 Winform 的开发体验而设计的一套机制,这套机制包含一个完整的 ASP.NET Webform 生命周期,Webform 从接受访问请求到输出页面内容,要经历一个周期,这个周期的存在是为了让开发者插入各种处理逻辑,这个 Webform 生命周期的效率并不理想。
为了解决这个问题,COMSHARP CMS 抛弃了 ASP.NET Webform 模式,而是直接调用 .NET 核心函数完成页面的输出,绕过 Webform 的生命周期,显着得提高了 COMSHARP CMS 页面的生成速度,并将速度提升到毫秒级。

❺ c语言编译没有错误,连接有错误是怎么回事程序本身没错

1、链接错误也不一定是系统的问题,也有可能是程序的问题。如果编译有错的话是不会有链接的,链接要有obj目标文件,编译不通过就没有目标文件。
2、连接错误及原因:
编译器错误 C2001 错误消息
常数中有换行符
字符串常数不能继续到第二行,除非进行下列操作:
•用反斜杠结束第一行。
•用一个双引号结束第一行上的字符串,并在下一行用另一个双引号开始该字符串。
用 \n 结束第一行是不够的。
编译器错误 C2002 错误消息
无效的宽字符常数
多字节字符常数是非法的。
通过检查下面的可能原因进行修复
1.宽字符常数包含的字节比需要的多。
2.未包括标准头文件 STDDEF.h。
3.宽字符不能与一般字符串连接。
4.宽字符常数之前必须是字符“L”:
编译器错误 C2003 错误消息
应输入“defined id”
标识符必须跟在预处理器关键字之后。
编译器错误 C2004 错误消息
应为“defined(id)”
标识符必须出现在预处理器关键字之后的括号中。
也可能由于为 Visual Studio .NET 2003 进行的编译器一致性工作生成此错误:在预处理器指

令中缺少括号。
如果预处理器指令缺少右括号,则编译器将生成一个错误。
编译器错误 C2005 错误消息
#line 应跟一个行号,却找到“token”
#line 指令后面必须跟行号。
编译器错误 C2006 错误消息
“directive”应输入文件名,却找到“token”
诸如 #include 或 #import 等指令需要文件名。若要解决该错误,请确保 token 是一个有效

文件名。并且将该文件名放在双引号或尖括号中。
编译器错误 C2007 错误消息
#define 语法
#define 后未出现标识符。若要解决该错误,请使用标识符。
编译器错误 C2008 错误消息
“character”: 宏定义中的意外
该字符紧跟在宏名之后。若要解决该错误,宏名之后必须有一个空格。
编译器错误 C2009 错误消息
宏形式“identifier”重复使用
宏定义的形参表多次使用该标识符。宏的参数列表中的标识符必须是唯一的。
编译器错误 C2010 错误消息
“character”: 宏形参表中的意外
该字符在宏定义的形参表中使用不正确。移除该字符以解决该错误。
编译器错误 C2011 错误消息
“identifier”:“type”类型重定义
该标识符已定义为 type 类型。如果多次将某个类型库导入同一个文件,也可能生成 C2011


编译器错误 C2012 错误消息
在“<”之后缺少名称
#include 指令缺少所需的文件名。
编译器错误 C2013 错误消息
缺少“>”
#include 指令缺少右尖括号。添加右尖括号以解决该错误。
编译器错误 C2014 错误消息
预处理器命令必须作为第一个非空白空间启动
预处理器指令的 # 符号必须是非空白行上的第一个字符。
编译器错误 C2015 错误消息
常数中的字符太多
一个字符常数包含的字符多于两个。标准字符常数只能包含一个字符,长字符常数只能包含两

个字符。
转义序列(如 \t)将被转换为单个字符。
当使用 Microsoft 扩展将字符常数转换为整数时,也可能发生 C2015。
编译器错误 C2017 错误消息
非法的转义序列
转义序列(如 \t)出现在字符或字符串常数之外。
当 stringize 运算符与包括转义序列的字符串一起使用时会发生 C2017。
编译器错误 C2018 错误消息
未知字符“hexnumber”
源文件包含一个意外的 ASCII 字符,该字符由其十六进制数标识。若要解决该错误,请移除

该字符。
编译器错误 C2019 错误消息
应找到预处理器指令,却找到“character”
该字符跟在 # 符号的后面,但它不是预处理器指令的第一个字母。
编译器错误 C2020 错误消息
“member”:“class”成员重定义
从基类或结构继承的成员被重定义。不能重定义继承成员,除非它在基类中被声明为 virtual


编译器错误 C2021 错误消息
应输入指数值,而非“character”
用作浮点常数的指数的字符是一个无效数字。确保使用的指数在范围之内。
编译器错误 C2022 错误消息
“number”: 对字符来说太大
字符或字符串常数中跟在反斜杠 (\) 后面的八进制数字太大,不能表示字符。
编译器错误 C2026 错误消息
字符串太大,已截断尾部字符
该字符串的长度超过了 16380 个单字节字符的**。
连接相邻字符串之前,字符串的长度不能超过 16380 个单字节字符。
大约为此长度的一半的 Unicode 字符串也会生成此错误。
编译器错误 C2027 错误消息
使用了未定义类型“type”
类型只有经过定义才能使用。若要解决该错误,请确保在引用类型前已对其进行了完全定义。
有可能声明一个指向已声明但未定义的类型的指针。但是 Visual C++ 不允许引用未定义的类

型。
编译器错误 C2028 错误消息
结构/联合成员必须在结构/联合中
结构或联合成员必须在结构或联合内部声明。
编译器错误 C2030 错误消息
“identifier”: 结构/联合成员重定义
结构或联合将同一标识符用于多个成员。
编译器错误 C2032 错误消息
“identifier”: 函数不能是结构/联合“structorunion”的成员
该结构或联合中的一个成员函数在 C++ 中允许使用而在 C 中却不允许。若要解决该错误,请

编译为 C++ 程序或移除该成员函数。
编译器错误 C2033 错误消息
“identifier”: 位域不能有间接寻址
该位域被声明为指针,这是不允许的。
编译器错误 C2034 错误消息
“identifier”: 位域类型对于位数太小
该位域声明中位的数目超过了基类型的大小。
编译器错误 C2036 错误消息
“identifier”: 未知的大小
对 identifier 的操作需要数据对象的大小,而该大小无法确定。
编译器错误 C2039 错误消息
“identifier1”: 不是“identifier2”的成员
该代码错误调用或引用了结构、类或联合的成员。
编译器错误 C2040 错误消息
“operator”:“identifier1”与“identifier2”的间接寻址级别不同
涉及该运算符的表达式具有不一致的间接寻址级别。
如果两个操作数都是算术的或都是非算术的(如数组或指针),则不用更改就可使用它们。如

果一个操作数是算术的,而另一个不是,则算术运算符将转换为非算术类型。
编译器错误 C2041 错误消息
非法的数字“character”(用于基“number”)
指定的字符不是基(如八进制或十六进制)的有效数字。
编译器错误 C2042 错误消息
signed/unsigned 关键字互相排斥
在单个声明中使用关键字 signed 和 unsigned。
编译器错误 C2043 错误消息
非法 break
break 仅在 do、for、while 或 switch 语句中合法。
编译器错误 C2044 错误消息
非法 continue
continue 仅在 do、for 或 while 语句中合法。
编译器错误 C2045 错误消息
“identifier”: 标签重定义
该标签出现在同一函数中的多条语句之前。
编译器错误 C2046 错误消息
非法的 case
关键字 case 只能出现在 switch 语句中。
编译器错误 C2047 错误消息
非法的 default
关键字 default 仅能出现在 switch 语句中。
编译器错误 C2048 错误消息
默认值多于一个
switch 语句包含多个 default 标签。删除其中一个 default 标签可解决该错误。
编译器错误 C2050 错误消息
switch 表达式不是整型
switch 表达式计算结果为一个非整数值。若要解决该错误,请在 switch 语句中只使用整数

值。
编译器错误 C2051 错误消息
case 表达式不是常数
Case 表达式必须是整数常数。
编译器错误 C2052 错误消息
“type”: 非法的 case 表达式类型
Case 表达式必须是整数常数。
编译器错误 C2053 错误消息
“identifier”: 宽字符串不匹配
宽字符串被分配给了一个不兼容的类型。
编译器错误 C2054 错误消息
在“identifier”之后应输入“(”
该函数标识符用在需要尾部括号的上下文中。
导致该错误的可能原因是省略了复杂初始化上的等号 (=)。
编译器错误 C2055 错误消息
应输入形参表,而不是类型表
函数定义包含参数类型列表而不包含形参表。ANSI C 需要命名的形参,除非它们是 void 或

是省略号 (...)。
编译器错误 C2056 错误消息
非法表达式
表达式因前一个错误而无效。
编译器错误 C2057 错误消息
应输入常数表达式
上下文要求常数表达式,即其值在编译时已知的表达式。
编译器错误 C2058 错误消息
常数表达式不是整型
该上下文需要整数常数表达式。
编译器错误 C2059 错误消息
语法错误 :“token”
该标记导致语法错误。
若要确定原因,则不仅要检查在错误信息中列出的行,还要检查该行上面的行。下面的示例对

声明 j 的行生成了错误信息,而该错误的真正源却出现在其上面的行中。
如果对行的检查没有获得有关可能出现的问题的任何线索,则尝试注释掉在错误信息中列出的

行以及可能出现在该行上面的若干行。
如果该错误信息在紧跟 typedef 变量的符号上出现,则检查该变量是否已在源代码中定义。
如果符号没有计算出任何结果(在使用 /Dsymbol= 编译时可能发生),可能会导致 C2059。
可能收到 C2059 的另一个特定原因是编译在函数的默认参数中指定了结构的应用程序。参数的

默认值必须是一个表达式。初始值设定项列表(如用于初始化结构的初始值设定项列表)不是表达式。其解决方法是定义一

个执行所需初始化的构造函数。
编译器错误 C2060 错误消息
语法错误 : 遇到文件结束
至少还需要一个标记。
编译器错误 C2061 错误消息
语法错误: 标识符“identifier”
编译器发现了不应在此出现的标识符。请确保在使用 identifier 之前对其进行声明。
初始值设定项可能括在了括号中。为避免该问题,请将声明符括在括号中或使其成为 typedef


在编译器将表达式作为类模板参数检测时也可能导致此错误;使用 typename 告诉编译器它是

一个类型。
编译器错误 C2062 错误消息
意外的类型“type”
编译器不需要类型名称。
编译器处理构造函数的参数列表中未定义类型的方式也可能导致 C2062。如果编译器遇到未定

义的(拼错了吗?)类型,则它假定构造函数是一个表达式,并发出 C2062。若要解决此错误,请只使用构造函数参数列表

中的定义类型。
编译器错误 C2063 错误消息
“identifier”: 不是函数
该标识符用作函数,但未声明为函数。
编译器错误 C2064 错误消息
项不会计算为接受“number”个参数的函数
通过表达式调用了函数。该表达式未计算为函数指针。
编译器错误 C2065 错误消息
“identifier”: 未声明的标识符
在可使用变量的类型前必须在声明中指定它。在可以使用函数前必须在声明或原型中指定该函

数使用的参数。
可能的原因:
1.您正在用 C 运行库的调试版本进行编译,在 for 循环中声明标准 C++ 库迭代器变量,然后

尝试在 for 循环范围外使用该迭代器变量。 用 C 运行库的调试版本编译标准 C++ 库代码暗指使用 /Zc:forScope。有关更

多信息,请参见调试迭代器支持。
2.可能正在调用当前不受生成环境支持的 SDK 头文件中的函数。
3.省略必要的包含文件,尤其是在定义 VC_EXTRALEAN、WIN32_LEAN_AND_MEAN 或

WIN32_EXTRA_LEAN 时。这些符号从 windows.h 和 afxv_w32.h 中排除了一些头文件以加快编译。(在 windows.h 和

afxv_w32.h 中查找排除的头文件的最新说明。)
4.标识符名拼写错误。
5.标识符使用了错误的大小写字母。
6.字符串常数的后面缺少右引号。
7.命名空间范围不正确。例如,若要解析 ANSI C++ 标准库函数和运算符,则必须用 using 指

令指定 std 命名空间。下面的示例未能编译,因为 using 指令被注释掉,并且在 std 命名空间中定义了 cout:

❻ nat1会降低延迟吗

设置好了可以降低的。
-网络环境:
我这边的网络环境,电信189套餐一共送了20条宽带。其中1条300M下30M上,1条100M下20M上,还有18条是50M下10M上,一条100M对等的联通,在加上后期拉的2条500M电信对等,所以家里一共是23条宽带,都为公网IP。3个电信光猫,1个联通光猫,若干路由器,交换机。
-CDN节点共享(闲置流量换钱):
早期,我网络环境没这么多,就玩迅雷的红水晶,再到迅雷路由,再到赚钱宝再到玩客云,可以说是一路走来。其中一代赚钱宝和赚钱宝pro挂的最久,后来不赚钱,就卖掉了大部分,玩客云因为网络的限制,留了几台,大部分抢到就是当倒爷。既然宽带这么多条,涉及到多线多拨,铁定上软路由,选爱快,操作简便,分流效果都挺好。既然有这么多闲置的带宽,刚好玩客云出现了现金,买几台试下,加上宽带提速加成,效果不错,于是就买了20几台,赚点小钱,毕竟穷。
-开始出现问题:
没想这玩意是真的能跑,20多台设备上传流量量速率达到了千兆,我用了几年的3215U 4口的软路由,开始不堪重负,100%的干活,也不知道是不是开繁星导致,反正感觉吃不消,但是上网啥的没问题,但是过了一阵子,发现当ap的ac88u,wifi开始不稳,会掉线,然后比较难连上。这让喜欢吃鸡的女王大人无法忍受,显然,挨骂是一定的。一开始以为是86u断流,用排除法,加上acrh17当ap,问题依旧,看来是就是软路由的锅。刚好电信有个500M对等的优惠套餐,果断办理,为了不受千兆端口限制,让电信小哥,再拉一条光纤,此时家里已经有了4个光猫了,电信3个,联通1。4口的软路由端口开始不够用了。宽带太多,很容易达到千兆瓶颈,一个光猫1G的带宽。
-性能不够硬件来凑
刚好同事需要软路由,把3215u出了。手头上还有dq77kb+e3 1265l v2,买个4口网卡当软路由,年少不懂事,上了淘宝买了i350-t4(寨卡)。不过还好用着没问题。这下性能应该不会瓶颈了,然而,wifi有时会连不上的问提依旧,看来是爱快的bug了,但是爱快用了好多年了,好多配置都在里面,如果换固件,调配置,比如ddns,端口转发,分流啥的,就要弄好久。但是wifi的问题不能不解决,刚好在群里看到有人说爱快,当设备跑多了,就会出现这个情况,上个三层交换机就会解决问题。那就上某鱼淘个二手的三层交换机来试试吧。后来看到群里有有人提到nat类型,对提高收益有帮助。于是大致了解了下,给大伙贴下。
-Nat类型
1. Full Cone NAT(简称NAT1):
所有来自同一 个内部Tuple X的请求均被NAT转换至同一个外部Tuple Y,而不管这些请求是不是属于同一个应用或者是多个应用的。除此之外,当X-Y的转换关系建立之后,任意外部主机均可随时将Y中的地址和端口作为目标地址 和目标端口,向内部主机发送UDP报文,由于对外部请求的来源无任何限制,因此这种方式虽然足够简单,但却不那么安全。
2. Restricted Cone NAT(简称NAT2):
它是Full Cone的受限版本:所有来自同一个内部Tuple X的请求均被NAT转换至同一个外部Tuple Y,这与Full Cone相同,但不同的是,只有当内部主机曾经发送过报文给外部主机(假设其IP地址为Z)后,外部主机才能以Y中的信息作为目标地址和目标端口,向内部主机发送UDP请求报文,这意味着,NAT设备只向内转发(目标地址/端口转换)那些来自于当前已知的外部主机的UDP报文,从而保障了外部请求来源的安全性。
3. Port Restricted Cone NAT(简称NAT3):
它是Restricted ConeNAT的进一步受限版。只有当内部主机曾经发送过报文给外部主机(假设其IP地址为Z且端口为P)之后,外部主机才能以Y中的信息作为目标地址和目标端口,向内部主机发送UDP报文,同时,其请求报文的源端口必须为P,这一要求进一步强化了对外部报文请求来源的限制,从而较Restrictd Cone更具安全性。
4. Symmetric NAT(简称NAT4):
这是一种比所有Cone NAT都要更为灵活的转换方式:在Cone NAT中,内部主机的内部Tuple与外部Tuple的转换映射关系是独立于内部主机所发出的UDP报文中的目标地址及端口的,即与目标Tuple无关。
上面是我网络出来,反正只要认为nat1是最好的就行,根据我的经验来说,像爱快,高恪之类的软路由都是nat4,。Lede可以nat1,而平常普通路由拨号的nat类型为3,刷高恪和openwrt就可以做到nat1。当然只要你路由器做了dmz也是可以变成nat1,但是这个只能指定内网的一个主机,你多台的就不行。那nat1对提高收益有帮助吗?对此,我还专门做了测试,拿出矿渣newifi3,编译了对应的openwrt固件,感谢lean大雕的源码,开始挂上,做为期几天的测试,结论是确实可以提高收益,而且对p2p游戏下载啥的也有帮助。
-目前支持nat1固件:
openwrt系列,理论能刷的openwrt都可以
k2p高恪固件,
acrh17也可以刷改版梅林实现full cone(感谢大雕的固件,该有的功能都有。)
梅林固件,目前只有新内核才支持,例如ac86u,ax88u。

❼ 如何在 Windows 下编译 OpenSSL

在Windows下编译OpenSSL (VS2010使用VC10的cl编译器)
1、安装ActivePerl//初始化的时候,需要用到perl解释器
2、使用VS2010下的Visual Studio 2010 Command Prompt进入控制台模式(这个模式会自动设置各种环境变量)
3、解压缩openssl的包,进入openssl的目录
4、perl configure VC-WIN32
尽量在这个目录下执行该命令,否则找不到Configure文件,或者指定完整的Configure文件路径。
5、ms\do_ms.bat
解压目录下执行ms\do_ms.bat命令
6、nmake -f ms\ntdll.mak
7、nmake -f ms\nt.mak

编译后
在openssl解压目录下执行,完成编译后。输出的文件在out32dll (6), out32 (7)里面,包括应用程序的可执行文件、lib文件和dll文件

注意:在运行第五步时,cl编译器会抱怨说.\crypto\des\enc_read.c文件的read是The POSIX name for this item is deprecated(不被推荐的),建议使用_read。呵呵,我可不想将OpenSSL中的所有的read函数修改为_read。再看cl的错误代码error C2220,于是上MSDN上查找:
warning treated as error - no object file generated
/WX tells the compiler to treat all warnings as errors. Since an error occurred, no object or executable file was generated.
是由于设置了/WX选项,将所有的警告都作为错误对待,所以。。。

于是打开OpenSSL目录下的MS目录下的ntdll.mak文件,将CFLAG的/WX选项去掉,存盘。。。
继续执行nmake -f ms\ntdll.mak

=================================
一、编译并安装OpenSSL
1、按照标准步骤从源代码编译安装OpenSSL
在编译OpenSSL前,需要正确安装Perl,因为在编译OpenSSL时需要使用到该程序。

下载最新版本的Perl然后安装之。
下载最新版本的OpenSSL

然后将源码解压缩到某个目录(如 C:\openssl-0.9.8j)中。

进入openssl源码目录。
cd c:\openssl-1.0.1e

以下为参照该目录下的文件INSTALL.W32的执行过程:
运行configure:
perl Configure VC-WIN32
创建Makefile文件:
ms\do_ms.bat

编译动态库:
nmake -f ms\ntdll.mak
编译静态库:
nmake -f ms\nt.mak
测试动态库:
nmake -f ms\ntdll.mak test
测试静态库:
nmake -f ms\nt.mak test
安装动态库:
nmake -f ms\ntdll.mak install
安装静态库:
nmake -f ms\nt.mak install
清除上次动态库的编译,以便重新编译:
nmake -f ms\ntdll.mak clean
清除上次静态库的编译,以便重新编译:
nmake -f ms\nt.mak clean
2、如果嫌麻烦,不想编译,可以直接用别人做好的windows OpenSSL 安装包(我用的是0.9.8j版),
可以下载 OpenSSL for Windows,直接安装。
P.S. OpenSSL for Windows 的源代码有一些数据类型和VC6的编译器不兼容,我发现的不兼容的数据类型如下:
在OpenSSL安装目录的下的include/bn.h文件中,将
#define BN_ULLONG unsigned long long
#define BN_ULONG unsigned long long
#define BN_LONG long long
分别修改为:
#define BN_ULLONG ULONGLONG
#define BN_ULONG ULONGLONG
#define BN_LONG LONGLONG
否则,会出现编译错误。

二、使用OpenSSL
在VC中配置使用以上的函数库:
点击菜单:Tools -> Options,弹出对话框"Options",在该对话框中选择"Directories"标签。
在"Show directories for:"的"Include files"选项中新增目录"C:\openssl\include";
"Library files"选择中新增目录"C:\openssl\lib"。
然后在需要链接OpenSSL函数库的工程中加入如下两句:
#pragma comment(lib, "ssleay32.lib")
#pragma comment(lib, "libeay32.lib")
其作用是将OpenSSL所需的库导入工程中。
三、问题
我在链接OpenSSL的静态函数库时遇到类似以下的问题:
Linking...
msvcrt.lib(MSVCRT.dll) : error LNK2005: _strchr already defined in libcmtd.lib(strchr.obj)
...

这是由于OpenSSL的静态函数库使用的是了VC的多线程DLL的Release版本,而我的程序使用了多线程静态链接的Release版本。
调整OpenSSL的静态函数库使用的库函数版本即可,调整过程如下:

编辑文件 ms\nt.mak,将该文件第19行
"CFLAG= /MD /Ox /O2 /Ob2 /W3 /WX /Gs0 /GF /Gy /nologo -DOPENSSL_SYSNAME_WIN32 -DWIN32_LEAN_AND_MEAN -DL_ENDIAN -DDSO_WIN32 -D_CRT_SECURE_NO_DEPRECATE -
D_CRT_NONSTDC_NO_DEPRECATE /Fdout32 -DOPENSSL_NO_CAMELLIA -DOPENSSL_NO_SEED -DOPENSSL_NO_RC5 -DOPENSSL_NO_MDC2 -DOPENSSL_NO_TLSEXT -DOPENSSL_NO_KRB5 -
DOPENSSL_NO_DYNAMIC_ENGINE"
中的"/MD"修改为"/MT"。然后重新编译安装OpenSSL即可。
四、附录:在VC中对C/C++ 运行时库不同版本编译指令说明
《在VC中对C/C++ 运行时库不同版本编译指令说明》一文中详细介绍了连接不同版本库的编译指令如下:
C Runtime Library:
/MD MSVCRT.LIB 多线程DLL的Release版本
/MDd MSVCRTD.LIB 多线程DLL的Debug版本
/MT LIBCMT.LIB 多线程静态链接的Release版本
/MTd LIBCMTD.LIB 多线程静态链接的Debug版本
/clr MSVCMRT.LIB 托管代码和非托管代码混合
/clr:pure MSVCURT.LIB 纯托管代码
C++ Standard Library:
/MD MSVCPRT.LIB 多线程DLL的Release版本
/MDd MSVCPRTD.LIB 多线程DLL的Debug版本
/MT LIBCPMT.LIB 多线程静态链接的Release版本
/MTd LIBCPMTD.LIB 多线程静态链接的Debug版本
===============================================

一 配置编译参数
配置编译参数是进行OpenSSL编译的第一步,这一步可以确定系统的环境,使用什么编译器,默认安装路径以及其他一些选项.步骤如下:
1.安装perl:下载ActivePerl-5.8.8.822-MSWin32-x86-280952.msi,然后点击msi文件进行安装!

2..配置编译参数:下载openssl-1.0.1e.tar.gz,解压.
vc:首先在C:\Program Files\Microsoft Visual Studio .NET 2010\VC10\bin\目录下执行vcvars32.bat,然后在解压后的openssl-1.0.1e目录,执行命令配置编译参数:perl Configure VC-WIN32
bc:在解压后的openssl-0.9.8g目录下执行:perl Configure BC-32

二 生成批处理文件
在使用configure脚本配置好的编译参数后,就可以使用批处理命令来生成编译脚本.生成编译脚本根据采用编译器的不同通常使用不同的批处理文件.就目前来说,使用vc编译的时候有三种选择:do_ms,do_masm和do_nasm来创建一系列编译脚本文件,即.mak脚本.步骤如下:
vc:在openssl-1.0.1e目录下,执行命令来批处理文件:do_ms,do_masm和do_nasm
bc:1.下载nsm09839.zip微软汇编编译器,解压,拷贝到c:/windows目录下,修改名称为nasmw.exe;2.在openssl-1.0.1e目录下,执行命令来批处理文件:ms\do_nasm

三 代码编译
vc:
完成上面步骤后,可以看到两个关键脚本文件:nt.mak和ntdll.mak.如果我们需要编译后的OpenSSL库是支持动态DLL形式的,那么应该使用ntddll.mak文件进行编译,这样编译完成我们会得到四个与OpenSSL的API库有关文件:ssleay32.lib,libeay32.lib,ssleay32.dll和libeay32.dll.执行的编译命令形式如下:nmake -f ms\ntdll.mak
如果不希望以动态库的形式使用OpenSSL,那么可以使用nt.mak文件进行编译.这样编译后使用OpenSSL的时候,回直接将代码链接进我们的程序里面.执行命令如下:nmake -f ms\nt.mak
bc:执行命令来完成代码编译:make -f ms\bcb.mak
四 ELSE
1)测试动态库:
nmake -f ms\ntdll.mak test
测试静态库:
nmake -f ms\nt.mak test

安装动态库:
nmake -f ms\ntdll.mak install
安装静态库:
nmake -f ms\nt.mak install

清除上次动态库的编译,以便重新编译:
nmake -f ms\ntdll.mak clean
清除上次静态库的编译,以便重新编译:
nmake -f ms\nt.mak clean

2)使用OpenSSL
在VC中配置使用以上的函数库:
点击菜单:Tools -> Options,弹出对话框"Options",在该对话框中选择"Directories"标签。
在"Show directories for:"的"Include files"选项中新增目录"C:\openssl\include";"Library files"选择中新增目录"C:\openssl\lib"。
然后在需要链接OpenSSL函数库的工程中编译时加入"libeay32.lib"就可以了。

❽ 有没有人成功编译过LEAN大的LEDE

按照错误提示,"试图加载重复的模块"。
它指出,在文件config_PA_thir.c(或者.asm...,这个你自己看一下),模块PA_CONF_FIR就是那个有问题的模块。

❾ vs2008添加预编译命令

以预编译头文件为Stdafx.h为例:
Qt Creator中很简单,只需在.pro文件中加入一行PRECOMPILED_HEADER = stdafx.h
VS2008在工程中在Stdafx.h文件上右键propertis-Configuration Properties-C/C++-Precompiled Headers-Create/Use Precompiled Header中选择Create Precompiled Header(/y).
有一点注意的是,在工程Generated Filed中的moc相关文件也需要选上Use Precompiled Header (/Yu).

阅读全文

与lean编译环境相关的资料

热点内容
程序员罗技 浏览:180
软考初级程序员课程2021下载 浏览:487
杭州程序员奶奶 浏览:878
不听命令造成错误 浏览:979
kool系统源码 浏览:608
流氓app在哪里看 浏览:98
域名购买了怎么指向服务器 浏览:121
安卓手机如何让照片颜色反转 浏览:859
怎么下载卓睿安手机版 浏览:514
h3crange命令 浏览:468
php前景和python 浏览:338
php压缩图片内存大小 浏览:495
在哪里可以查看云服务器的信息 浏览:70
python读取非txt文件 浏览:799
艾莫迅用什么编程软件好 浏览:227
android文件存储读取 浏览:214
php基础教程第5版 浏览:543
服务器里面怎么刷东西 浏览:194
荣耀手机如何快速把app切换页面 浏览:798
傻瓜式php源码 浏览:359