框架编译流
❶ 用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 程序。