当前位置:首页 » 编程软件 » hpp编译

hpp编译

发布时间: 2022-11-16 13:24:52

编译器在编译阶段,究竟做哪些事情

1. 预处理首先源代码文件(.c/.cpp)和相关头文件(.h/.hpp)被预处理器cpp预编译成.i文件(C++为.ii)。预处理命令为:gcc –E hello.c –o hello.i预编译过程主要处理那些源代码中以#开始的预编译指令,主要处理规则如下:u 将所有的#define删除,并且展开所有的宏定义;u 处理所有条件编译指令,如#if,#ifdef等;u 处理#include预编译指令,将被包含的文件插入到该预编译指令的位置。该过程递归进行,及被包含的文件可能还包含其他文件。u 删除所有的注释//和 /**/;u 添加行号和文件标识,如#2 “hello.c” 2,以便于编译时编译器产生调试用的行号信息及用于编译时产生编译错误或警告时能够显示行号信息;u 保留所有的#pragma编译器指令,因为编译器须要使用它们。2. 编译编译过程就是把预处理完的文件进行一系列词法分析,语法分析,语义分析及优化后生成相应的汇编代码文件(.s)。编译的命令为:gcc –S hello.i –o hello.s或者从源文件直接输出汇编代码文件:gcc –S hello.c –o hello.s现在版本的GCC把预编译和编译两个步骤合并成一个步骤,由程序cc1来完成(C++为cc1plus)。3. 汇编汇编就是将汇编代码转变成机器可以执行的命令,生成目标文件(.o),汇编器as根据汇编指令和机器指令的对照表一一翻译即可完成。汇编的命令为:gcc –c hello.s –o hello.o或者从源文件直接输出目标文件:gcc –c hello.c –o hello.o4. 链接链接就是链接器ld将各个目标文件组装在一起,解决符号依赖,库依赖关系,并生成可执行文件。链接的命令为:ld –static crt1.o crti.o crtbeginT.o hello.o –start-group –lgcc –lgcc_eh –lc-end-group crtend.o crtn.o一般我们使用一条命令就可以完成上述4个步骤:gcc hello.c实际上gcc只是一些其它程序的包装,它会根据不同参数去调用预编译编译程序cc1、汇编器as、链接器ld。

⑵ 为什么C++类的头文件中包含hpp文件时会报错呢

虽然你是一句话。但是凭我的经验来说。我已经明白了你的问题。
你的意思是 你的类 声明在 .h文件中。定义在.cpp文件中。这个.cpp文件肯定包含了前面的.h文件。
然后这个.h中 包含了 某个 .hpp文件。于是编译的时候 相当于 .h包含了一次 .hpp。.cpp也包含了一次.hpp。如果.hpp文件中 你定义了全局变量或者全局函数。则会编译报错——重定义!!。
这也是我 超级不喜欢用.hpp的原因。建议 吧.hpp文件 拆分成.h和.cpp。或者不要在.hpp里面定义全局的变量和函数

⑶ 如何编译Delphi组件让其在C++ Builder中可用

1、首先,我们要使用Rad Studio,而不是Delphi或C++Builder来操作,所以注意第一点,否则可会失败哟。如果你只装了CB或只装了Delphi,你就重装吧。
2、打开相应版本的Delphi版目录,发现有两个VirtualTreesD和VirtualTreesR两个Delphi安装包,Delphi用户那里,我们可以窃听到一个重要的信息:以R结尾的一般是运行时包,以D结尾的一般是设计期包。所以我们要先打开运行期包VirtualTreesR.dpk:
3、打开项目选项(Project->Options),然后找到关键的地方:Delphi Compiler->Output-C/C++,在最右侧的C/C++ Output file generation里,选中Generate all C++ Builder files(Including package libs)选项,然后选OK关闭窗口。
4、Ctrl+F9编译项目,完成运行时包的编译。
5、重复上面的步骤打开VirtualTreesD.dpk,然后修改完选项后,选择Install来安装包,然后你会幸运的得到提示,提示你组件已经安装成功了。
6、现在新建一个项目,到组件面板上找TVirtualStringTree吧。
同样的经验适用于其它绝大多数Delphi控件,比如Graphics32,但注意你可能需要对最终生成的HPP文件做一些改动,以避免与C++里自带的内容冲突,这个遇到一处改掉一处,就不再缀述了。

⑷ opencv怎么一编译全是cxcore.hpp的错误啊,求高手救命..

上述提示说的意思是:没找到DLL的符号信息。
说明你的程序运行需要(或间接需要)这些DLL。
应该是配置问题,下面这个网址有详细说明OpenCV的配置

另外,检查一下你是bug版,还是release版。OpenCV bug版应配置文件名带d的DLL,比如cxcore100d.dll,release版是cxcore100.dll

⑸ 为什么需要编译OpenCV源代码

..\OpenCV2.3\opencv\moles 这个目录有一些常用的库,一般算法的实现是看不到的,通常在静态库里,你可以连接他们,生成执行文件。
hpp,其实质就是将.cpp的实现代码混入.h头文件当中,定义与实现都包含在同一文件,则该类的调用者只需要include该hpp文件即可,无需再 将cpp加入到project中进行编译。而实现代码将直接编译到调用者的obj文件中,不再生成单独的虎矗港匪蕃睹歌色攻姬obj,采用hpp将大幅度减少调用 project中的cpp文件数与编译次数,也不用再发布烦人的lib与dll,因此非常适合用来编写公用的开源库。

⑹ C++builder编译时提示TeCanvas.hpp库函数有错

这种情况一般是,在安装三方控件的电脑中建立的工程,在工程中没有用到它,但在工程文件中包含它,这时,换一台电脑后,没有安装这个三方控件,就提示出错。
解决方法:在你的电脑中,用无格式的文本编辑软件打开这个工程文件,找到它,删除,就可以解决问题。

⑺ .hpp是什么文件

hpp是C++程序头文件 。

HPP,计算机术语,用C/C++语言编写的头文件,通常用来定义数据类型,声明变量、函数、结构和类。
hpp,其实质就是将.cpp的实现代码混入.h头文件当中,定义与实现都包含在同一文件,则该类的调用者只需要include该hpp文件即可,无需再 将cpp加入到project中进行编译。而实现代码将直接编译到调用者的obj文件中,不再生成单独的obj,采用hpp将大幅度减少调用 project中的cpp文件数与编译次数,也不用再发布烦人的lib与dll,因此非常适合用来编写公用的开源库。

⑻ VS2008下编译BasicExcel.hpp和cpp不通过,请问具体原因,急!!!!

看看BasicExcel.h里面是不是还引用了其他文件,也得加进去

⑼ HPP的注意问题

*.hpp要注意的问题有:
a)不可包含全局对象和全局函数
由于hpp本质上是作为.h被调用者include,所以当hpp文件中存在全局对象或者全局函数,而该hpp被多个
调用者include时,将在链接时导致符号重定义错误。要避免这种情况,需要去除全局对象,将全局函数封
装为类的静态方法。
b)类之间不可循环调用
在.h和.cpp的场景中,当两个类或者多个类之间有循环调用关系时,只要预先在头文件做被调用类的声明
即可,如下:
class B;
class A{
public:
void someMethod(B b);
};
class B{
public:
void someMethod(A a);
};
在hpp场景中,由于定义与实现都已经存在于一个文件,调用者必需明确知道被调用者的所有定义,而不能等到cpp
中去编译。因此hpp中必须整理类之间调用关系,不可产生循环调用。同理,对于当两个类A和B分别定义在各自的
hpp文件中,形如以下的循环调用也将导致编译错误:
//a.hpp
#include b.hpp
class A{
public:
void someMethod(B b);
};
//b.hpp
#include a.hpp
class B{
public:
void someMethod(A a);
}
c)不可使用静态成员
静态成员的使用限制在于如果类含有静态成员,则在hpp中必需加入静态成员初始化代码,当该hpp被多个文档include时,将产生符号重定义错误。唯 一的例外是const static整型成员,因为在vs2003中,该类型允许在定义时初始化,如:
class A{
public:
const static int intValue = 123;
};
由于静态成员的使用是很常见的场景,无法强制清除,因此可以考虑以下几种方式(以下示例均为同一类中方法)
一、类中仅有一个静态成员时,且仅有一个调用者时,可以通过局域静态变量模拟
//方法模拟获取静态成员
someType getMember()
{
static someType value(xxx);//作用域内静态变量
return value;
}
二、.类中有多个方法需要调用静态成员,而且可能存在多个静态成员时,可以将每个静态成员封装一个模拟方法,供其他方法调用。
someType getMemberA()
{
static someType value(xxx);//作用域内静态变量
return value;
}
someType getMemberB()
{
static someType value(xxx);//作用域内静态变量
return value;
}
void accessMemberA()
{
someType member = getMemberA();//获取静态成员
};
//获取两个静态成员
void accessStaticMember()
{
someType a = getMemberA();//获取静态成员
someType b = getMemberB();
};
三、第二种方法对于大部分情况是通用的,但是当所需的静态成员过多时,编写封装方法的工作量将非常
巨大,在此种情况下,建议使用Singleton模式,将被调用类定义成普通类,然后使用Singleton将其变为
全局唯一的对象进行调用。
如原h+cpp下的定义如下:
class A{
public:
type getMember(){
return member;
}
static type member;//静态成员
}
采用singleton方式,实现代码可能如下(singleton实现请自行查阅相关文档)
//实际实现类
class Aprovider{
public:
type getMember(){
return member;
}
type member;//变为普通成员
}
//提供给调用者的接口类
class A{
public:
type getMember(){
return Singleton<AProvider>::getInstance()->getMember();
}
}

⑽ c++.hpp什么时候用

1、是Header Plus Plus 的简写。
2、与*.h类似,hpp是C++程序头文件 。
3、是VCL 专用的头文件,已预编译。
4、是一般模板类的头文件。
5、一般来说,*.h里面只有声明,没有实现,而*.hpp里声明实现都有,后者可以减 少.cpp的数量。
hpp要注意的问题 http://ke..com/view/3779455.htm

热点内容
交叉编译优化 发布:2025-05-14 03:48:52 浏览:531
动图在线压缩 发布:2025-05-14 03:35:24 浏览:132
w7共享无法访问 发布:2025-05-14 03:35:24 浏览:482
为什么微信会出现账号密码错误 发布:2025-05-14 03:03:30 浏览:692
幻影脚本官网 发布:2025-05-14 03:01:13 浏览:826
servlet的webxml怎么配置 发布:2025-05-14 02:51:46 浏览:772
怎么取消手势密码 发布:2025-05-14 02:51:11 浏览:639
openvpn搭建vpn服务器搭建 发布:2025-05-14 02:47:52 浏览:998
密码忘了从哪里找 发布:2025-05-14 02:39:09 浏览:548
我的世界什么服务器有前途 发布:2025-05-14 02:30:31 浏览:528