『壹』 用vc建立windows32api程序,編譯時顯示不能打開頭文件windows.h 怎麼弄
自己找到include 文件夾 新建個 txt文件 名字改成 windows.h
然後復制 粘貼進去保存
/*++ BUILD Version: 0001 Increment this if a change has global effects
Copyright (c) 1985-1997, Microsoft Corporation
Mole Name:
windows.h
Abstract:
Master include file for Windows applications.
--*/
#ifndef _WINDOWS_
#define _WINDOWS_
#ifndef WINVER
#define WINVER 0x0400
#else
#if defined(_WIN32_WINNT) && (WINVER < 0x0400) && (_WIN32_WINNT > 0x0400)
#error WINVER setting conflicts with _WIN32_WINNT setting
#endif
#endif
#if(WINVER >= 0x0500)
#pragma message ("")
#pragma message ("NOTE: WINVER has been defined as 0x0500 or greater which enables")
#pragma message ("Windows NT 5.0 and Windows 98 features. When these headers were released,")
#pragma message ("Windows NT 5.0 beta 1 and Windows 98 beta 2.1 were the current versions.")
#pragma message ("")
#pragma message ("For this release when WINVER is defined as 0x0500 or greater, you can only")
#pragma message ("build beta or test applications. To build a retail application,")
#pragma message ("set WINVER to 0x0400 or visit http://www.microsoft.com/msdn/sdk")
#pragma message ("to see if retail Windows NT 5.0 or Windows 98 headers are available.")
#pragma message ("")
#pragma message ("See the SDK release notes for more information.")
#pragma message ("")
#endif
#ifndef _INC_WINDOWS
#define _INC_WINDOWS
#if defined (_MSC_VER) && (_MSC_VER >= 1020)
#pragma once
#endif
/* If defined, the following flags inhibit definition
* of the indicated items.
*
* NOGDICAPMASKS - CC_*, LC_*, PC_*, CP_*, TC_*, RC_
* NOVIRTUALKEYCODES - VK_*
* NOWINMESSAGES - WM_*, EM_*, LB_*, CB_*
* NOWINSTYLES - WS_*, CS_*, ES_*, LBS_*, SBS_*, CBS_*
* NOSYSMETRICS - SM_*
* NOMENUS - MF_*
* NOICONS - IDI_*
* NOKEYSTATES - MK_*
* NOSYSCOMMANDS - SC_*
* NORASTEROPS - Binary and Tertiary raster ops
* NOSHOWWINDOW - SW_*
* OEMRESOURCE - OEM Resource values
* NOATOM - Atom Manager routines
* NOCLIPBOARD - Clipboard routines
* NOCOLOR - Screen colors
* NOCTLMGR - Control and Dialog routines
* NODRAWTEXT - DrawText() and DT_*
* NOGDI - All GDI defines and routines
* NOKERNEL - All KERNEL defines and routines
* NOUSER - All USER defines and routines
* NONLS - All NLS defines and routines
* NOMB - MB_* and MessageBox()
* NOMEMMGR - GMEM_*, LMEM_*, GHND, LHND, associated routines
* NOMETAFILE - typedef METAFILEPICT
* NOMINMAX - Macros min(a,b) and max(a,b)
* NOMSG - typedef MSG and associated routines
* NOOPENFILE - OpenFile(), OemToAnsi, AnsiToOem, and OF_*
* NOSCROLL - SB_* and scrolling routines
* NOSERVICE - All Service Controller routines, SERVICE_ equates, etc.
* NOSOUND - Sound driver routines
* NOTEXTMETRIC - typedef TEXTMETRIC and associated routines
* NOWH - SetWindowsHook and WH_*
* NOWINOFFSETS - GWL_*, GCL_*, associated routines
* NOCOMM - COMM driver routines
* NOKANJI - Kanji support stuff.
* NOHELP - Help engine interface.
* NOPROFILER - Profiler interface.
* NODEFERWINDOWPOS - DeferWindowPos routines
* NOMCX - Modem Configuration Extensions
*/
#if defined(RC_INVOKED) && !defined(NOWINRES)
#include <winresrc.h>
#else
#if defined(RC_INVOKED)
/* Turn off a bunch of stuff to ensure that RC files compile OK. */
#define NOATOM
#define NOGDI
#define NOGDICAPMASKS
#define NOMETAFILE
#define NOMINMAX
#define NOMSG
#define NOOPENFILE
#define NORASTEROPS
#define NOSCROLL
#define NOSOUND
#define NOSYSMETRICS
#define NOTEXTMETRIC
#define NOWH
#define NOCOMM
#define NOKANJI
#define NOCRYPT
#define NOMCX
#endif
#if !defined(_68K_) && !defined(_MPPC_) && !defined(_PPC_) && !defined(_ALPHA_) && !defined(_MIPS_) && !defined(_X86_) && defined(_M_IX86)
#define _X86_
#endif
#if !defined(_68K_) && !defined(_MPPC_) && !defined(_PPC_) && !defined(_ALPHA_) && !defined(_X86_) && !defined(_MIPS_) && defined(_M_MRX000)
#define _MIPS_
#endif
#if !defined(_68K_) && !defined(_MPPC_) && !defined(_PPC_) && !defined(_ALPHA_) && !defined(_X86_) && !defined(_MIPS_) && defined(_M_ALPHA)
#define _ALPHA_
#endif
#if !defined(_68K_) && !defined(_MPPC_) && !defined(_PPC_) && !defined(_ALPHA_) && !defined(_X86_) && !defined(_MIPS_) && defined(_M_PPC)
#define _PPC_
#endif
#if !defined(_68K_) && !defined(_MPPC_) && !defined(_PPC_) && !defined(_ALPHA_) && !defined(_X86_) && !defined(_MIPS_) && defined(_M_M68K)
#define _68K_
#endif
#if !defined(_68K_) && !defined(_MPPC_) && !defined(_PPC_) && !defined(_ALPHA_) && !defined(_X86_) && !defined(_MIPS_) && defined(_M_MPPC)
#define _MPPC_
#endif
#ifndef _MAC
#if defined(_68K_) || defined(_MPPC_)
#define _MAC
#endif
#endif
#ifndef RC_INVOKED
#if ( _MSC_VER >= 800 )
#pragma warning(disable:4001)
#pragma warning(disable:4201)
#pragma warning(disable:4214)
#pragma warning(disable:4514)
#endif
#include <excpt.h>
#include <stdarg.h>
#endif /* RC_INVOKED */
#include <windef.h>
#include <winbase.h>
#include <wingdi.h>
#include <winuser.h>
#ifdef _MAC
DECLARE_HANDLE(HKEY);
typedef HKEY *PHKEY;
#endif
#if !defined(_MAC) || defined(_WIN32NLS)
#include <winnls.h>
#endif
#ifndef _MAC
#include <wincon.h>
#include <winver.h>
#endif
#if !defined(_MAC) || defined(_WIN32REG)
#include <winreg.h>
#endif
#ifndef _MAC
#include <winnetwk.h>
#endif
#ifndef WIN32_LEAN_AND_MEAN
#include <cderr.h>
#include <dde.h>
#include <ddeml.h>
#include <dlgs.h>
#ifndef _MAC
#include <lzexpand.h>
#include <mmsystem.h>
#include <nb30.h>
#include <rpc.h>
#endif
#include <shellapi.h>
#ifndef _MAC
#include <winperf.h>
#if(_WIN32_WINNT >= 0x0400)
#include <winsock2.h>
#include <mswsock.h>
#else
#include <winsock.h>
#endif /* _WIN32_WINNT >= 0x0400 */
#endif
#ifndef NOCRYPT
#include <wincrypt.h>
#endif
#ifndef NOGDI
#include <commdlg.h>
#ifndef _MAC
#include <winspool.h>
#ifdef INC_OLE1
#include <ole.h>
#else
#include <ole2.h>
#endif /* !INC_OLE1 */
#endif /* !MAC */
#endif /* !NOGDI */
#endif /* WIN32_LEAN_AND_MEAN */
#ifdef _MAC
#include <winwlm.h>
#endif
#ifdef INC_OLE2
#include <ole2.h>
#endif /* INC_OLE2 */
#ifndef _MAC
#ifndef NOSERVICE
#include <winsvc.h>
#endif
#if(WINVER >= 0x0400)
#ifndef NOMCX
#include <mcx.h>
#endif /* NOMCX */
#ifndef NOIME
#include <imm.h>
#endif
#endif /* WINVER >= 0x0400 */
#endif
#ifndef RC_INVOKED
#if ( _MSC_VER >= 800 )
#pragma warning(default:4001)
#pragma warning(default:4201)
#pragma warning(default:4214)
/* Leave 4514 disabled. It's a stupid warning anyway. */
#endif
#endif /* RC_INVOKED */
#endif /* RC_INVOKED */
#endif /* _INC_WINDOWS */
#endif /* _WINDOWS_ */
『貳』 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).
『叄』 android性能測試工具有哪些
大概有如下幾個工具:
android針對上面這些會影響到應用性能的情況提供了一些列的工具:
1 布局復雜度:
hierarchyviewer:檢測布局復雜度,各視圖的布局耗時情況:
Android開發者模式—GPU過渡繪制:
2 耗電量:Android開發者模式中的電量統計;
3 內存:
應用運行時內存使用情況查看:Android Studio—Memory/CPU/GPU;
內存泄露檢測工具:DDMS—MAT;
4 網路:Android Studio—NetWork;
5 程序執行效率:
靜態代碼檢查工具:Android studio—Analyze—Inspect Code.../Code cleanup... ,用於檢測代碼中潛在的問題、存在效率問題的代碼段並提供改善方案;
DDMS—TraceView,用於查找程序運行時具體耗時在哪;
StrictMode:用於查找程序運行時具體耗時在哪,需要集成到代碼中;
Andorid開發者模式—GPU呈現模式分析。
6 程序穩定性:monkey,通過monkey對程序在提交測試前做自測,可以檢測出明顯的導致程序不穩定的問題,執行monkey只需要一行命令,提交測試前跑一次可以避免應用剛提交就被打回的問題。
說明:
上面提到的這些工具可以進Android開發者官網性能工具介紹查看每個工具的介紹和使用說明;
Android開發者選項中有很多測試應用性能的工具,對應用性能的檢測非常有幫助,具體可以查看:All about your phone's developer options和15個必知的Android開發者選項對Android開發者選項中每一項的介紹;
針對Android應用性能的優化,Google官方提供了一系列的性能優化視頻教程,對應用性能優化具有非常好的指導作用,具體可以查看:優酷Google Developers或者Android Performance Patterns。
二 第三方性能優化工具介紹
除了android官方提供的一系列性能檢測工具,還有很多優秀的第三方性能檢測工具使用起來更方便,比如對內存泄露的檢測,使用leakcanry比MAT更人性化,能夠快速查到具體是哪存在內存泄露。
leakcanary:square/leakcanary · GitHub,通過集成到程序中的方式,在程序運行時檢測應用中存在的內存泄露,並在頁面中顯示,在應用中集成leancanry後,程序運行時會存在卡頓的情況,這個是正常的,因為leancanry就是通過gc操作來檢測內存泄露的,gc會知道應用卡頓,說明文檔:LeakCanary 中文使用說明、LeakCanary: 讓內存泄露無所遁形。
GT:GT Home,GT是騰訊開發的一款APP的隨身調測平台,利用GT,可以對CPU、內存、流量、點亮、幀率/流暢度進行測試,還可以查看開發日誌、crash日誌、抓取網路數據包、APP內部參數調試、真機代碼耗時統計等等,需要說明的是,應用需要集成GT的sdk後,GT這個apk才能在應用運行時對各個性能進行檢測。
『肆』 vs2010如何編譯驅動
1、安裝VS2010,安裝WDK 7.0(DDK);
2、新建VC++->Empty Project
3、打開Configuration Manager 並新建一個名稱為「 dirver 」的Solution Configuration 並將「dirver」 設為Active Solution Configuration .
4、打開View-> property Manager。
5、在"dirver" solution configuration 上點擊右鍵,選擇Add new property Sheet。取名為「dirverProperty」. 並對他進下以下設置。
5.1. C\C++ - General - Debug Information Format = Program Database (/Zi)
5.2. C\C++ - Preprocessor - Preprocessor Definitions = _X86_ [add also DBG for Debug config]
【WIN32;_DEBUG;_X86_;i386;STD_CALL;CONDITION_HANDLING;WIN32_LEAN_AND_MEAN;NT_UP;SRVDBG;DBG;_IDWBUILD;_WIN32_WINNT=0x0400;% (PreprocessorDefinitions)】
5.3. C\C++ - Code Generation - Enable C++ Exceptions = No
5.4. C\C++ - Code Generation - Basic Runtime Checks = Default
5.5. C\C++ - Code Generation - Buffer Security Check = No (/GS-)
5.6. C\C++ - Advanced - Calling Convention = __stdcall (/Gz)
5.7. C\C++ - Advanced - Compile As = Compile as C Code (/TC) [if you are going to use plain C]
5.8. Linker - General - Output File = $(OutDir)\$(ProjectName).sys
5.9. Linker - General - Enable Incremental Linking = Default
5.10. Linker - Input - Additional Dependencies = ntoskrnl.lib hal.lib $(NOINHERIT) [add here needed libs here e.g. ntoskrnl.lib hal.lib]
【不知道上面是不是筆誤,應該為:ntoskrnl.lib;hal.lib;%(AdditionalDependencies)】
5.11. Linker - Input - Ignore All Default Libraries = Yes (/NODEFAULTLIB)
5.12. Linker - Manifest File - Generate Manifest = No
5.13. Linker - System - SubSystem = Native (/SUBSYSTEM:NATIVE)
5.14. Linker - System - Driver = Driver (/DRIVER)
5.15. Linker - Advanced - Entry Point = DriverEntry
5.16. Linker - Advanced - Base Address = 0x10000
5.17. Linker - Advanced - Randomized Base Address = Disable (/DYNAMICBASE:NO)
【這個也是錯誤的:應該置空】
5.18. Linker - Advanced - Data Execution Prevention (DEP) = Disable (/NXCOMPAT:NO)
【這個也是錯誤的:應該置空】
6. Config VC++ Directories
6.1 Open Open up property manager by clicking on Menu View->Property Manager.
6.2 Expand the project node and then the Configuration|Platform nodes, you will see "Microsoft.cpp.<Platform>.users" file for each Configuration|Platform. These are the files
for the global settings, similar to the old tools/Options/VC++ Directories.
6.3 Multi-Select "Microsoft.cpp.<Platform>.users", right click and bring up the property page window
6.4 In the property page window, click on "VC++ Directories" (for example) in the left pane, add new paths for the directories such as "Include Directories". separated by
semicolons
(eg:Include Directories config As:
$(ddkroot)\INC
$(ddkroot)\INC\WNET
$(ddkroot)\INC\DDK\WNET
Library Directories config As:
$(ddkroot)\LIB\WNET\I386
)
6.5 Make sure to save the settings before shutting down Visual Studio.
6.6 Re-launch Visual Studio and the new settings will be in effect.
6.7 Note: If you would like to only change the settings for one project, you can right click on the project and bring up the property page. Change the settings for 「VC++
Directories」, these settings will be persisted to the project file.
七. OK. Have done. Now you can test it with simple code, e.g.:
#include "ntddk.h"
NTSTATUS
DriverEntry(PDRIVER_OBJECT DriverObject,PUNICODE_STRING RegistryPath)
{
return STATUS_UNSUCCESSFUL;
}
特別說明:
1.
Visual Studio 2010 在智能設備開發方面只支持Windows Phone OS 7.0。如果你要為Windows CE 5.0和Windows Mobile 6.5開發應用程序,請安裝Visual Studio 2008。
2.
做驅動開發時,SDK的版本要和WDK的版本一致,即Win7 WDK要配Win7 SDK,否則會出現編譯錯誤。VS2010里集成了Windows SDK 7.0A。
3.
如果出現類似如下編譯錯誤,解決方法是:拷貝C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\sal.h,然後覆蓋掉C:\WinDDK\7600.16385.1\inc\api\sal.h。
C:\Program Files\Microsoft Visual Studio 10.0\VC\include\crtdefs.h(550): error C2143: syntax error : missing ')' before 'const'
C:\Program Files\Microsoft Visual Studio 10.0\VC\include\crtdefs.h(550): error C2143: syntax error : missing '{' before 'const'
.......
『伍』 有沒有人成功編譯過LEAN大的LEDE
按照錯誤提示,"試圖載入重復的模塊"。
它指出,在文件config_PA_thir.c(或者.asm...,這個你自己看一下),模塊PA_CONF_FIR就是那個有問題的模塊。
『陸』 什麼是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語言編譯、連接的各種錯誤
編譯器錯誤 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:
編譯器錯誤 C2066 錯誤消息
轉換到函數類型是非法的
在 ANSI C 中,函數指針和數據指針間的轉換是非法的。
編譯器錯誤 C2067 錯誤消息
轉換到數組類型是非法的
對象被轉換成了數組類型。
編譯器錯誤 C2069 錯誤消息
「void」項到非「void」項的強制轉換
類型 void 不能轉換成任何其他類型。
編譯器錯誤 C2070 錯誤消息
「type」: 非法的 sizeof 操作數
sizeof 運算符需要一個表達式或類型名稱。
編譯器錯誤 C2071 錯誤消息
「identifier」: 非法的存儲類
聲明 identifier 所用的存儲類無效。
編譯器錯誤 C2072 錯誤消息
「identifier」: 函數的初始化
錯誤指定了函數初始值設定項。
編譯器錯誤 C2073 錯誤消息
「identifier」: 部分初始化數組的元素必須有默認構造函數
為用戶定義的類型或常數的數組指定的初始值設定項太少。如果沒有為數組成員指定明確的初
始值設定項及其對應的構造函數,則必須提供默認的構造函數。
編譯器錯誤 C2074 錯誤消息
「identifier」:「class-key」初始化需要大括弧
在指定的類、結構或聯合初始值設定項兩邊沒有大括弧。
編譯器錯誤 C2075 錯誤消息
「identifier」: 數組初始化需要大括弧
在指定的數組初始值設定項兩邊沒有大括弧。
編譯器錯誤 C2077 錯誤消息
非標量欄位初始值設定項「identifier」
試圖用非標量(結構、聯合、數組或類)初始化位域。使用整數值或浮點值。
編譯器錯誤 C2078 錯誤消息
初始值設定項太多
初始值設定項的數目超過了要初始化的對象數。
編譯器錯誤 C2079 錯誤消息
「identifier」使用未定義的類/結構/聯合「name」
指定的標識符是一個未定義的類、結構或聯合。
初始化匿名聯合時,可能會導致此錯誤。
編譯器錯誤 C2081 錯誤消息
「identifier」: 形參表中的名稱非法
標識符導致語法錯誤。
此錯誤可能是由使用形參表的舊形式導致的。必須在形參表中指定形參的類型。
編譯器錯誤 C2082 錯誤消息
形參「identifier」的重定義
在函數體中重新聲明了函數的形參。若要解決該錯誤,請移除該重定義。
編譯器錯誤 C2083 錯誤消息
結構/聯合比較非法
結構或聯合直接與另一個用戶定義的類型進行比較。這是不允許的,除非已經定義了比較運算
符或者存在到標量類型的轉換。
編譯器錯誤 C2084 錯誤消息
函數「function」已有主體
函數已經定義。
在以前的 Visual C++ 版本中,
•編譯器將接受解析為同一實際類型的多個模板的專用化,盡管附加的定義將永遠不可用。現
在編譯器將檢測這些多重定義。
•__int32 和 int 已被視為單獨的類型。編譯器現在將 __int32 作為 int 的同義詞處理。這
意味著,如果函數同時在 __int32 和 int 上重載,編譯器將檢測多個定義,並提供一個錯誤。
編譯器錯誤 C2085 錯誤消息
「identifier」: 不在形參表中
該標識符在函數定義中聲明而未在形參表中聲明。(僅用於 ANSI C)
編譯器錯誤 C2086 錯誤消息
「identifier」: 重定義
多次定義了該標識符,或者後面的聲明與前一個不同。
C2086 也可能是增量編譯引用的 C# 程序集的結果。重新生成該 C# 程序集以解決此錯誤。
編譯器錯誤 C2087 錯誤消息
「identifier」: 缺少下標
具有多個下標的數組的定義缺少大於 1 的維度的下標值。
編譯器錯誤 C2088 錯誤消息
「operator」: 對於「class-key」非法
沒有為結構或聯合定義該運算符。該錯誤只對 C 代碼有效。
編譯器錯誤 C2089 錯誤消息
「identifier」:「class-key」太大
指定的結構或聯合超過 4GB 的**。
編譯器錯誤 C2090 錯誤消息
函數返回數組
函數不能返回數組。請返回指向數組的指針。
編譯器錯誤 C2091 錯誤消息
函數返回函數
函數不能返回函數。請返回指向函數的指針。
編譯器錯誤 C2092 錯誤消息
「array name」數組元素類型不能是函數
不允許使用函數數組。請使用指向函數的指針的數組。
編譯器錯誤 C2093 錯誤消息
「variable1」: 無法使用自動變數「variable2」的地址初始化
在用 /Za 編譯時,程序試圖將自動變數的地址用作初始值設定項。
編譯器錯誤 C2094 錯誤消息
標簽「identifier」未定義
goto 語句使用的標簽在函數中不存在。
編譯器錯誤 C2095 錯誤消息
「function」: 實參具有類型「void」:「number」參數
傳遞給函數的參數為 void 類型,這是不允許的。請改為使用指向 void 的指針 (void *)。
number 指示哪一個參數為 void。
編譯器錯誤 C2097 錯誤消息
非法的初始化
通過檢查下面的可能原因進行修復
1.使用非常數值初始化變數。
2.用長地址初始化短地址。
3.在用 /Za 編譯時,用非常數表達式初始化局部結構、聯合或數組。
4.用包含逗號運算符的表達式初始化。
5.用既非常數又非符號的表達式初始化。
編譯器錯誤 C2099 錯誤消息
初始值設定項不是常數
此錯誤只由 C 編譯器發出,而且只對非自動變數發生。編譯器在程序的開頭對非自動變數進
行初始化,並且用於對這些變數進行初始化的值必須是常數。
由於編譯時與運行時的浮點精度環境設置(有關更多信息,請參見 _controlfp_s)可能不同
,因此,編譯器無法在 /fp:strict 下對表達式執行常數合並。在這種情況下,也可能發生 C2099。
當常數合並失敗時,編譯器調用動態初始化,這在 C 中是不允許的。
要解決此錯誤,請將模塊編譯為 .cpp 文件或對表達式進行簡化。
『捌』 如何在 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"就可以了。