框架編譯流
❶ 用VS2005框架怎麼編譯C++程序啊求解
是的,我現在用的是VS2008,沒用濄2005
不過他們應該相似吧
你可以先在文件中創建一個新的win32 控制台程序
然後在視圖中找到解決方案資源管理器
讓後點擊一下
會出來你的項目的視圖
你要創建什麼就有右擊什麼,然後就可以用了
C++如何學習
By 一步塵 發表於 2006-12-18 10:40:00
1.把C++當成一門新的語言學習(和C沒啥關系!真的。);
2.看《Thinking In C++》,不要看《C++變成死相》;
3.看《The C++ Programming Language》和《Inside The C++ Object Model》,不要因為他們很難而我們自己是初學者所以就不看;
4.不要被VC、BCB、BC、MC、TC等詞彙所迷惑——他們都是集成開發環境,而我們要學的是一門語言;
5.不要放過任何一個看上去很簡單的小編程問題——他們往往並不那麼簡單,或者可以引伸出很多知識點;
6.會用Visual C++,並不說明你會C++;
7.學class並不難,template、STL、generic programming也不過如此——難的是長期堅持實踐和不遺餘力的博覽群書;
8.如果不是天才的話,想學編程就不要想玩游戲——你以為你做到了,其實你的C++水平並沒有和你通關的能力一起變高——其實可以時刻記住:學C++是為了編游戲的;
9.看Visual C++的書,是學不了C++語言的;
10.浮躁的人容易說:XX語言不行了,應該學YY;——是你自己不行了吧!?
11.浮躁的人容易問:我到底該學什麼;——別問,學就對了;
12.浮躁的人容易問:XX有錢途嗎;——建議你去搶銀行;
13.浮躁的人容易說:我要中文版!我英文不行!——不行?學呀!
14.浮躁的人容易問:XX和YY哪個好;——告訴你吧,都好——只要你學就行;
15.浮躁的人分兩種:a)只觀望而不學的人;b)只學而不堅持的人;
16.把時髦的技術掛在嘴邊,還不如把過時的技術記在心裡;
17.C++不僅僅是支持面向對象的程序設計語言;
18.學習編程最好的方法之一就是閱讀源代碼;
19.在任何時刻都不要認為自己手中的書已經足夠了;
20.請閱讀《The Standard C++ Bible》(中文版:標准C++寶典),掌握C++標准;
21.看得懂的書,請仔細看;看不懂的書,請硬著頭皮看;
22.別指望看第一遍書就能記住和掌握什麼——請看第二遍、第三遍;
23.請看《Effective C++》和《More Effective C++》以及《Exceptional C++》;
24.不要停留在集成開發環境的搖籃上,要學會控制集成開發環境,還要學會用命令行方式處理程序;
25.和別人一起討論有意義的C++知識點,而不是爭吵XX行不行或者YY與ZZ哪個好;
26.請看《程序設計實踐》,並嚴格的按照其要求去做;
27.不要因為C和C++中有一些語法和關鍵字看上去相同,就認為它們的意義和作用完全一樣;
28.C++絕不是所謂的C的「擴充」——如果C++一開始就起名叫Z語言,你一定不會把C和Z語言聯系得那麼緊密;
29.請不要認為學過XX語言再改學C++會有什麼問題——你只不過又在學一門全新的語言而已;
30.讀完了《Inside The C++ Object Model》以後再來認定自己是不是已經學會了C++;
31.學習編程的秘訣是:編程,編程,再編程;
32.請留意下列書籍:《C++面向對象高效編程(C++ Effective Object-Oriented Software Construction)》《面向對象軟體構造(Object-Oriented Software Construction)》《設計模式(Design Patterns)》《The Art of Computer Programming》;
33.記住:面向對象技術不只是C++專有的;
34.請把書上的程序例子親手輸入到電腦上實踐,即使配套光碟中有源代碼;
35.把在書中看到的有意義的例子擴充;
36.請重視C++中的異常處理技術,並將其切實的運用到自己的程序中;
37.經常回顧自己以前寫過的程序,並嘗試重寫,把自己學到的新知識運用進去;
38.不要漏掉書中任何一個練習題——請全部做完並記錄下解題思路;
39.C++語言和C++的集成開發環境要同時學習和掌握;
40.既然決定了學C++,就請堅持學下去,因為學習程序設計語言的目的是掌握程序設計技術,而程序設計技術是跨語言的;
41.就讓C++語言的各種平台和開發環境去激烈的競爭吧,我們要以學習C++語言本身為主;
42.當你寫C++程序寫到一半卻發現自己用的方法很拙劣時,請不要馬上停手;請盡快將餘下的部分粗略的完成以保證這個設計的完整性,然後分析自己的錯誤並重新設計和編寫(參見43);
43.別心急,設計C++的class確實不容易;自己程序中的class和自己的class設計水平是在不斷的編程實踐中完善和發展的;
44.決不要因為程序「很小」就不遵循某些你不熟練的規則——好習慣是培養出來的,而不是一次記住的;
45.每學到一個C++難點的時候,嘗試著對別人講解這個知識點並讓他理解——你能講清楚才說明你真的理解了;
46.記錄下在和別人交流時發現的自己忽視或不理解的知識點;
47.請不斷的對自己寫的程序提出更高的要求,哪怕你的程序版本號會變成Version 100.XX;
48.保存好你寫過的所有的程序——那是你最好的積累之一;
49.請不要做浮躁的人;
50.請熱愛C++!
❷ 如何寫一個編譯時註解框架
1、註解
我們日常使用的很多開源庫都有註解的實現,主要有運行時註解和編譯時註解兩種。
運行時註解:主要作用就是得到註解的信息
Retrofit:
調用
@GET("/users/{username}")
User getUser(@Path("username") String username);
定義
@Documented
@Target(METHOD)
@Retention(RUNTIME)
@RestMethod("GET")
public @interface GET {
String value();
}
編譯時註解:主要作用動態生成代碼
Butter Knife
調用
@InjectView(R.id.user)
EditText username;
定義
@Retention(CLASS)
@Target(FIELD)
public @interface InjectView {
int value();
}
2、編譯時註解
要實現編譯時註解需要3步:
1、定義註解(關於註解的定義可以參考下面引用的博客)
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.ElementType;
@Target({ ElementType.FIELD, ElementType.TYPE })
@Retention(RetentionPolicy.CLASS)
public @interface Seriable
{
}
2、編寫註解解析器
@SupportedAnnotationTypes("annotation.Seriable")
@SupportedSourceVersion(SourceVersion.RELEASE_6)
public class ViewInjectProcessor extends AbstractProcessor {
@Override
public boolean process(Set annotations,
RoundEnvironment roundEnv) {
for (Element ele : roundEnv.getElementsAnnotatedWith(InjectView.class)) {
if(ele.getKind() == ElementKind.FIELD){
//todo
}
return true;
}
@SupportedAnnotationTypes,定義要支持註解的完整路徑,也可以通過getSupportedAnnotationTypes方法來定義
@Override
public Set getSupportedAnnotationTypes() {
Set types = new LinkedHashSet<>();
types.add(InjectView.class.getCanonicalName());
return types;
}
@SupportedSourceVersion(SourceVersion.RELEASE_6)表示支持的jdk的版本
3、創建制定文件resources/META-INF/services/javax.annotation.processing.Processor,並填寫註解解析器的類路徑,這樣在編譯的時候就能自動找到解析器
看上去實現編譯時註解還是很容易的,但是真要完整的實現一個類似Butter Knife的框架,這還只是開始。
Butter Knife是專注View的注入,在使用註解的類編譯後,查看編譯後的class文件,會發現多出了文件,如:
SimpleActivity$$ViewInjector.java
SimpleActivity$$ViewInjector.java,就是通過編譯時註解動態創建出來的,查看SimpleActivity$$ViewInjector.java的內容
// Generated code from Butter Knife. Do not modify!
package com.example.butterknife;
import android.view.View;
import butterknife.ButterKnife.Finder;
public class SimpleActivity$$ViewInjector {
public static void inject(Finder finder, final com.example.butterknife.SimpleActivity target, Object source) {
View view;
view = finder.findRequiredView(source, 2131230759, "field 'title'");
target.title = (android.widget.TextView) view;
view = finder.findRequiredView(source, 2131230783, "field 'subtitle'");
target.subtitle = (android.widget.TextView) view;
view = finder.findRequiredView(source, 2131230784, "field 'hello', method 'sayHello', and method 'sayGetOffMe'");
target.hello = (android.widget.Button) view;
view.setOnClickListener(
new butterknife.internal.DebouncingOnClickListener() {
@Override
public void doClick(
android.view.View p0
) {
target.sayHello();
}
});
view.setOnLongClickListener(
new android.view.View.OnLongClickListener() {
@Override
public boolean onLongClick(
android.view.View p0
) {
return target.sayGetOffMe();
}
});
view = finder.findRequiredView(source, 2131230785, "field 'listOfThings' and method 'onItemClick'");
target.listOfThings = (android.widget.ListView) view;
((android.widget.AdapterView) view).setOnItemClickListener(
new android.widget.AdapterView.OnItemClickListener() {
@Override
public void onItemClick(
android.widget.AdapterView p0,
android.view.View p1,
int p2,
long p3
) {
target.onItemClick(p2);
}
});
view = finder.findRequiredView(source, 2131230786, "field 'footer'");
target.footer = (android.widget.TextView) view;
}
public static void reset(com.example.butterknife.SimpleActivity target) {
target.title = null;
target.subtitle = null;
target.hello = null;
target.listOfThings = null;
target.footer = null;
}
}
inject方法進行初始化,reset進行釋放。inject都是調用Finder的方法與android系統的findViewById等方法很像,再來看Finder類,只截取部分。
public enum Finder {
public T findRequiredView(Object source, int id, String who) {
T view = findOptionalView(source, id, who);
if (view == null) {
String name = getResourceEntryName(source, id);
throw new IllegalStateException("Required view '"
+ name
+ "' with ID "
+ id
+ " for "
+ who
+ " was not found. If this view is optional add '@Nullable' (fields) or '@Optional'"
+ " (methods) annotation.");
}
return view;
}
public T findOptionalView(Object source, int id, String who) {
View view = findView(source, id);
return castView(view, id, who);
}
@Override protected View findView(Object source, int id) {
return ((View) source).findViewById(id);
}
@SuppressWarnings("unchecked") // That's the point.
public T castView(View view, int id, String who) {
try {
return (T) view;
} catch (ClassCastException e) {
if (who == null) {
throw new AssertionError();
}
String name = getResourceEntryName(view, id);
throw new IllegalStateException("View '"
+ name
+ "' with ID "
+ id
+ " for "
+ who
+ " was of the wrong type. See cause for more info.", e);
}
}
findRequiredView方法實際上就是我們常用findViewById的實現,其動態幫我們添加了這些實現。view注入的原理我們就清楚了。
雖然編譯時創建了這個類,運行的時候如何使用這個類呢,這里我用自己實現的一個類來描述
public class XlViewInjector {
static final Map, AbstractInjector> INJECTORS = new LinkedHashMap, AbstractInjector>();
public static void inject(Activity activity){
AbstractInjector injector = findInjector(activity);
injector.inject(Finder.ACTIVITY, activity, activity);
}
public static void inject(Object target, View view){
AbstractInjector injector = findInjector(target);
injector.inject(Finder.VIEW, target, view);
}
private static AbstractInjector findInjector(Object target){
Class clazz = target.getClass();
AbstractInjector injector = INJECTORS.get(clazz);
if(injector == null){
try{
Class injectorClazz = Class.forName(clazz.getName()+"$$"+ProxyInfo.PROXY);
injector = (AbstractInjector) injectorClazz.newInstance();
INJECTORS.put(clazz, injector);
}catch(Exception e){
e.printStackTrace();
}
}
return injector;
}
}
XlViewInjector與ButterKnife,比如調用時我們都會執行XlViewInjector.inject方法,通過傳入目標類的名稱獲得封裝後的類實例就是SimpleActivity$$ViewInjector.java,再調用它的inject,來初始化各個view。
總結一下整個實現的流程:
1、通過編譯時註解動態創建了一個包裝類,在這個類中已解析了註解,實現了獲取view、設置監聽等代碼。
2、執行時調用XlViewInjector.inject(object)方法,實例化object類對應的包裝類,並執行他的初始化方法inject;
因此我們也能明白為什麼XlViewInjector.inject(object)方法一定要在setContentView之後執行。
3、實現註解框架時的坑
解析有用到android api,因此需要創建Android工程,但是android library並沒有javax的一些功能,
在eclipse環境下,右鍵build-path add library把jdk加進來
在android studio下,需要先創建java Library功能,實現與view無關的解析,再創建一個android library功能引用這個工程並實現餘下的解析。
❸ 如何:編譯工作流
然後,可使用工作流編譯器編譯該工作流文件,或者不對它進行編譯,而通過主機應用程序將它傳遞到工作流運行時引擎中。 這稱為「無代碼工作流創作」。 有關更多信息,請參見 使用工作流標記 。 所創建的文件使用的文件擴展名為 .xoml。 標記文件可用於聲明工作流,但之後會使用包含實現邏輯的代碼文件對它進行編譯。 這稱為「代碼分離工作流創作」。 在這種情況下,所創建的文件使用的文件擴展名為 .xoml 和 .xoml.cs 或 .xoml.vb。 在代碼文件中使用 Windows Workflow Foundation 對象模型。 這稱為「僅限代碼工作流創作」。 在這種情況下,所創建的文件使用標準的 C# 或 Visual Basic 源代碼文件擴展名。 此外,也會對這些文件進行編譯。
❹ 基於POCO框架的C程序怎麼編譯
下面簡單介紹一下方法,以 vs2010 為例。
第一種方法:
(1) Poco 根目錄下有build_vs100.cmd和buildwin.cmd這兩個批處理文件, 我們得修改一下它們。
把build_vs100.cmd 修改為以下內容:
@echo off
if defined VS100COMNTOOLS (
call "C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\bin\amd64\vsvars64.bat")
buildwin 100 build all both x64 samples
紅色的部分是vsvars64.bat的路徑,具體要看本機的安裝位置。這里因為是要編譯X64,所以要修改環境。
藍色部分是執行編譯時候的參數(注意X64的X要小寫)。參數的具體說明為:
buildwin VS_VERSION [ACTION] [LINKMODE] [CONFIGURATION] [PLATFORM] [SAMPLES] [TESTS] [TOOL]
VS_VERSION: 71|80|90|100|110
ACTION: build|rebuild|clean
LINKMODE: static_mt|static_md|shared|all
CONFIGURATION: release|debug|both
PLATFORM: Win32|x64|WinCE
SAMPLES: samples|nosamples
TESTS: tests|notests
TOOL: devenv|vcexpress|msbuild
具體的參數選擇根據需求。
如果不需要 NetSSL_OpenSSL 和 Mysql ,此時保存後就雙擊它就行了。 它會自動編譯好各種庫。
如果要NetSSL_OpenSSL 這個庫則打開buildwin.cmd文件:
設置 openssl 的路徑,如:
set OPENSSL_DIR=c:\OpenSSL-Win64
set OPENSSL_INCLUDE=%OPENSSL_DIR%\include
set OPENSSL_LIB=%OPENSSL_DIR%\lib;%OPENSSL_DIR%\lib\VC
set INCLUDE=%INCLUDE%;%OPENSSL_INCLUDE%
set LIB=%LIB%;%OPENSSL_LIB%
注意,如果要 Poco 中的 MySQL 庫 還得安裝. Mysql
編輯好後,雙擊 build_vs100.cmd執行編譯。完成後會在Poco根目錄下的lib64中看到編譯好的庫。在bin64中有編譯好的dll。
❺ .NET Frame work編譯機制(二次編譯)
C++和.Net程序採用了兩種不同的編譯方式。通常一個C++編寫的程序,都是一次編譯成二進制的代碼,在相應的操作系統平台上直接執行即可。而.Net程序採用兩次編譯的方式,用C#,VB.Net等語言寫成的程序被編譯成IL代碼,通過CLR在運行的時候JIT編譯成為本地二進制代碼。
MFC和WinForm很多設計上的不同從根本上說,都是因為編譯模式帶來的不同。因此,在仔細探討MFC和WinForm之前,有必要細細體會一下不同編譯方式帶來的改變。
考慮一段代碼,它需要在不同的編譯環境下生成不同的代碼,或者是為了減少代碼編寫量用一些替換方式取代類似的代碼。在C++中利用預編譯和宏來解決這些事情。MFC框架中,更是大量使用宏來進行核心功能的設計。但是宏只是一種巧妙的減少輸入代碼量的方式,本質上和手寫輸入一些代碼並無區別(也許不夠嚴密吧),它並不能在程序運行的時候動態支持代碼的插入和改變,因為此時它已經編譯完成了。而二次編譯則不同,你可以將它的第一次編譯看成是通常一次編譯程序的預編譯期,只是這個預編譯更為的強大,它可以編譯生成信息更為豐富的元數據。並且,只要在JIT執行前動態插入代碼,利用反射等手段,就可以將已經編譯好的程序的行為在某種程度上進行改變,其動態性能得到了本質上的改變。
因此,在MFC和WinForm中,我們可以看到兩者在動態性能,安全性和效率方面都有很大的不同,總結一下,都可以歸結到這不同的編譯模式上來。在以後的日誌中,都可以看到這些區別的
❻ 什麼是程序的編輯器,編譯器,什麼是Framework(框架)
編譯器是程序輔助工具,一般會生成一些幫助代碼
框架是編程的一種模式,把正個代碼實現的功能按起的作用分類,可以使思路清析
❼ xp框架模塊怎麼編譯
暫時可能沒有什麼好的辦法,可以試試修改相應程序的屬性為XP兼容模式試試。
❽ 關於用.NET Framework 4框架編譯的C#的問題
可以把整個.NET庫打包進你的程序里,但這樣做的話,你的exe文件會變得異常龐大,而且啟動速度變慢。如果你真的要這么做的話,去下載安裝SPOON STUDIO 2011,英文的,而且需要破解.是否用得了看你能力高低了
❾ 怎樣對ssh框架結構的編譯之後的.class進行混淆處理,防止反編譯。
使用ProGuard這款反編譯工具,具體操作網上有很多相關的操作步驟介紹,例子見下載proguard的example
❿ 如何編譯CNTK框架
如何編譯CNTK框架
現階段不可能。
.NET 下你用的所有 CLR 方法也好類也好都是封裝在一個個 .NET Framework 的 DLL 里的,程序運行時必須這些文件,除非你一個 CLR 類和方法都沒用過(那不就是純 C 語言而且是只有標准庫的 C 了么)。
有些類似於 Remote Soft's Salamander .NET Native Compiler、Infralution Globalizer 這些工具,也不是把代碼編譯成機器語言了,而是把需要的類庫等直接寫入了 PE,會導致程序體積大大增加,而且只支持 .NET 2.0,最重要的是還是收費軟體。
微軟自己倒是新推出了個 .NET Native,不過可惜的是目前只支持 .NET 4.5 下的 Windows 8 App 程序。