最近在一个大型项目的开发的时候遇到一个很头疼的问题,由于该项目的代码更,每次建立联系1纪要.浪费时间调试.因此,一些研究如何提高编译链接速度,这里给大家分享. 为了提高编译和链接的是以下三种方式的速度: 1. 增加XCode编译时使用的线程数 defaults write com.apple.Xcode PBXNumberOfParallelBuildSubtasks 4 XCode默认使用与CPU核数同样的线程来进行编译,但因为编译过程中的IO操作往往比CPU运算要多,因此适当的提升线程数能够…
最近在开发一个大项目的时候遇到一个很头疼的问题,由于项目代码较多,每次都要编译链接1分钟左右,调试的时候很浪费时间,于是研究了一下如何提高编译链接的速度,在这里分享给大家. 提升编译链接的速度主要有以下三个方式: 1. 提高XCode编译时使用的线程数 defaults write com.apple.Xcode PBXNumberOfParallelBuildSubtasks 4 XCode默认使用与CPU核数相同的线程来进行编译,但由于编译过程中的IO操作往往比CPU运算要多,因此适当的提升…
1 编译链接过程分为 预处理--->编译---->汇编---->链接.如下图所示 2 预处理都做了什么 (1)将所有的#define删除并展开所有的宏 (2)处理所有的条件预编译指令比如#if #ifdef (3)处理#Incldue预编译指令,将包含的文件插入到预编译的文件中.采用头文件的目的是可以供多个不同的cpp源程序使用.自己定义的通常用“”,如果包含库文件的一般是“<>”. (4)过滤所有的注释符号 (5)添加行号和文件标识.方便再编译器产生调试用的行号信息等 (6…
在Windows下使用习惯了IDE,导致我们对程序的编译链接没有一个清晰的认识,甚至混淆了编辑器和编译器的概念.在学习Linux时,这些问题就暴露出来了. 实际上,我们应该严格区分一个程序从产生到执行的整个过程:写代码->编译->链接->可执行程序. 1 写程序 严格来说,无论我们是否在IDE中写程序,我们都相当于在一个记事本上写了一个.txt文件.在进行编译之前,我们写的程序就是一堆文字而已,并没有什么逻辑关系而言,这一点很重要!!! 即使在Windows中,在VS中写c++程序,所提…
使用过开源C/C++项目的同学们都知道,标准的编译过程已经变成了简单的三部曲:configure/make/make install, 使用起来很方便,不像平时自己写代码,要手写一堆复杂的Makefile,而且换个编译环境,Makefile还需要修改(Eclipse也是这样). 这么好的东东当然要拿来用了,但GNU的Autotool系列博大精深,工具数量又多,涉及的语言也多,要是自己从头看到尾,黄花菜都凉了,项目估计早就结束了:上网搜样例倒是有一大堆,但都是“hello world”的样例,离真…
提升编译链接的速度主要有以下三个方式: 1. 提高XCode编译时使用的线程数 defaults write com.apple.Xcode PBXNumberOfParallelBuildSubtasks 4 XCode默认使用与CPU核数相同的线程来进行编译,但由于编译过程中的IO操作往往比CPU运算要多,因此适当的提升线程数可以在一定程度上加快编译速度.本人采用的是4核的CPU,将线程数改为8后编译速度略有提升. 2. 将Debug Information Format改为DWARF 在工…
在某些项目中看到一些环境变量类似宏的东西 比如叫ENVIRONMENT, 但发现还找不到具体这个宏是什么值, 那是因为他实在Preprocessing里配置了这个宏的值, 他能配置debug/release下的不同值,所以你肯定是找不到的 配置变量如下: APIUrl, 他就是一个环境变量名(宏), 程序在编译的时候会根据编译环境替换后面的值 在代码中只需直接写他的环境变量名就可以 NSString *strUrl = APIUrl; 注意: 在配置APIUrl的时候后面的字符串一定要写成转义字…
几个星期以前开始折腾在我的MBA上写 OpenGL 小程序.我不太熟悉MacOS上的开发工具比如XCode,所以一开始的想法就是用vim来写程序,然后手工编译链接.网上查了一下,MacOS上的OpenGL编译选项跟 windows 和 Linux 上的很不一样, 不是用 -I 来指定头文件搜索路径,用-l来链接库文件.MacOS SDK把一些应用库包装成了所谓的“Framework”,其中就包括OpenGL,GLUT 和 Cocoa.所以MacOS下的OpenGL程序(我用到了GLUT)是这样编…
近期参与的项目中使用了公司另外一个同事提供的一个静态库文件.该静态库文件集成了CUDA, OpenCL两个库,用于做图形加速计算,提高视频解码拼接速度.但是在编译链接项目时,VS爆出如下错误: 1>LIBCMTD.lib(crt0init.obj) : error LNK2005: __xi_a 已经在 MSVCRT.lib(cinitexe.obj) 中定义 1>LIBCMTD.lib(crt0init.obj) : error LNK2005: __xi_z 已经在 MSVCRT.lib(…
编译链接过程 代码 #cat main.c #include <stdio.h> int add(int x, int y); int sub(int x, int y); int mul(int x, int y); int div(int x, int y); int main(void) { printf("add:%d\n", add(1,2)); printf("sub:%d\n", sub(10,100)); printf("mul…
下面展示了Delphi是怎样编译源文件,并且把它们链接起来,最终形成可执行文件. 当Delphi编译项目(Project)时,将编译项目源文件.窗体单元和其他相关单元,在这个过程中将会发生好几件事情: 首先,Object Pascal编译器把项目单元编译为二进制对象文件,然后资源编辑器将把诸如程序图标.窗体文件等资源编译成二进制资源文件,接着链接开始起作用:链接器根据编译器产生的二进制文件,依项目需要增加一些库文件,并把这些文件综合在一起产生最终的可执行文件. 编译.创建和链接 每当点击Run按…
一,COMMON块 什么是COMMON块,这是一种机制,早期的Fortran没有动态分配空间的机制,程序员必须事先声明它所需要的临时使用空间的大小.Fortran把这种空间叫做COMMON块,当不同的目标文件需要的COMMON块空间大小不一致时,以最大的一块为准. 关与强弱符号的定义我们已经学习过,简单来说,编译器将未初始化的全局变量的定义作为弱符号处理,已初始化的作为强符号处理. 多个符号定义类型不一致的几种情况: 1,两个或两个以上强符号类型不一致:      2,有一个强符号,其他的都是弱…
针对这些问题,这次做一个补充: 一,可重定位文件的格式是什么,以main.o为例, 格式为ELF ,包括:{1,ELF Header 它描述了整个文件的文件属性,包括文件是否可以执行,是静态链接还是动态链接及入口地址(若是可执行                                             文件),目标硬件,目标操作系统等等. 2,   .text(代码段) 按四字节对齐 一般C语言编译后执行语句都编译成机器代码,保存在这个段中 3,   .data(数据段) 已初始化…
C++开始,为什么要写这个东西,因为按照课堂进度的话,现在的C++已经学到模板以及重载了,有时却仍然因为一些小问题无法解答,原因是忘记了开始时学到的知识,深知不能像猴子掰棒子一样,掰一个扔一个,因此,现在踏踏实实的回顾一下.另外希望各位博友们随时指正,不甚感激! 前部分大概分为,1,深入编译链接.2,函数调用堆栈.3,C跟C++的区别.4,面向对象思想...(未完待续) 温故而知新. --------------------------------------------------------…
前阵子有遇到代码编译速度慢的问题,特别是在swift和object-c混编的过程中问题很突显. 网上找到一篇蛮好的文章里面又一些解决方法 推荐一下 http://www.open-open.com/lib/view/open1475993635756.html 当然除了这篇推荐外,自己还做了一些理解. 代码编译速度慢.首先我们应该想到的是 编译速度慢是跟你的编译器有关系的. 一下列出几个方向供参考 1.swift 是类型安全的,所以我们在经常定义变量的时候由于使用方便会直接 var x = a这…
1.创建c文件 touch demo.c 2.编辑c代码 3.编译(预编译.检查语法.编译).链接 3.1.指令:cc  -c  demo.c 正常情况下,会生成一个demo.o的二进制文件(即:目标文件) 3.2.指令:cc  demo.o  给demo.o添加启动代码并进行链接,生成可执行文件a.out 3.3.指令:./a.out   或者   直接把a.out拖入终端  让操作系统去调度CPU执行a.out 小技巧:可以直接 cc  demo.c,然后生成a.out可执行文件,省略了生成…
在gcc编译器环境下,常见的文件扩展名的含义如下: .c:C源程序,经过预编译后的源程序也为.c文件,它可以通过-E参数输出. .h:头文件 .s:经过编译得到的汇编程序代码,它可以通过-S参数输出. .o:目标文件 .a:函数库 Gcc编译器常见语法: -c:只进行编译,不进行链接,输出的是与源文件同名的.o文件. -o:指定生成的文件的名称.链接生成可执行文件,这个参数后可以带可执行文件的名字,如果没有指定可执行文件的名字,则会默认为a.out. -S:输出汇编代码文件,输出一个与源文件同名…
转载请标明: 编译链接是使用高级语言编程所必须的操作,一个源程序只有经过编译.链接操作以后才可以变成计算机可以理解并执行的二进制可执行文件. 编译是指根据用户写的源程序代码,经过词法和语法分析,将高级语言编写的代码转变为功能有效的汇编代码. 编译过程如下: 1.  预编译过程 在c语言的预编译过程中,主要是对宏定义.条件编译语句.头文件包含语句以及特殊符号进行处理. 对于宏定义语句,比如#define NAME “user”,则在预编译阶段,会将程序中所有的NAME都替换为usr,当前有一点值得…
除非明确说明,本文内容仅针对x86/x86_64的Linux开发环境,有朋友说baidu不到,开个贴记录一下(加粗字体是关键词): 用“-Wl,-Bstatic”指定链接静态库,使用“-Wl,-Bdynamic”指定链接共享库,使用示例:-Wl,-Bstatic -lmysqlclient_r -lssl -lcrypto -Wl,-Bdynamic -lrt -Wl,-Bdynamic -pthread -Wl,-Bstatic -lgtest("-Wl"表示是传递给链接器ld的参数…
1.   序 最近在折腾各种.so,碰到了一些问题,一开始对于很多错误也没有头绪,茫然不知所措.索性化了一天多时间将<<程序员的自我修养—链接.装载与库>>中部分内容略读了一遍,主要是关于编译,链接和加载这块的.于是顺便做个笔记,方便以后回顾.基本上知道了这些,对于编译,链接和加载过程中产生的各种问题,应该就能从根本上理解并解决了.其实以前上学时也看过那本经典的<<Linker and loader>>,当时还写了篇<<链接器和加载器原理>…
前言 一直以来对Linux下编译链接产生的问题没有好好重视起来,出现问题就度娘一下,很多时候的确是在搜索帮助下解决了BUG,但由于对原因不求甚解,没有细细研究,结果总是在遇到在BUG时弄得手忙脚乱得. 甚至有时候为了一个问题查了半天的资料,好不容易解决了,却因为没有记录下来或者没有弄清楚真实原因,结果第二次碰到还是要去重复前次的折腾,很是尴尬无奈. 虽然,同样的错误信息,其产生的原因不一而足,但是,总结一下终归是好的,使不知变知之,只要不在同一件事情上重复同样的错误,发现的问题越多,解决的问题越…
一.基础研究 在这里我们需要提供一套新的c语言开发工具cc,它支持的c程序不是从main开始运行而是从CMain开始运行. 书上已经对该工具程序进行了需求分析:(1)要在屏幕中间显示彩色的字符串:(2)等待用户输入,按下任意键后开始运行程序员写的程序. 也给出了由需求分析进行的功能分析:代码文件main.obj实现打印字符串.等待输入.调用程序的功能.编译链接文件cc.exe实现调用tcc编译文件.调用tlink连接文件的功能. 新建文件夹,在其中实现main.c如图: 将main.c编译成ma…
1.学习过程 在c:\下建立文件夹c,并将编译器tcc.exe.连接器tlink.exe.相关文件c0s.obj.cs.lib.emu.lib.maths.lib放入文件夹中. 要搭建一个简单的C语言编译环境,需要TC2.0.c0s.obj.emu.lib.maths.lib.graphics.lib.cs.lib文件.而这里用编译器tcc.exe.连接器tlink.exe代替了TC2.0,而且相关文件也少了graphics.lib,为什么这样也可以呢?我们先尝试在新建立的环境下编译连接一个文件…
摘自http://blog.csdn.net/elfprincexu/article/details/45043971 gcc/g++等编译器 编译原理: 预处理,编译,汇编,链接各步骤详解 C和C++编译器是集成的,编译一般分为四个步骤: 预处理(preprocessing)  ----------------- cpp/ gcc -E  编译(compilation) ------------------ cc1 / gcc -S 汇编(assembly)  ----------------…
一.编译方式的示例详解 1. 编译C代码 代码如下:main.c /*!  ******************************************************************************  * \File  *   main.c  * \Brief  *   C codes  * \Author  *   Hank  *******************************************************************…
一,关于编译链接编译指的的把编译单元生成目标文件的过程链接是把目标文件链接到一起的过程编译单元:可以认为是一个.c或者.cpp文件.每个编译单元经过预处理会得到一个临时的编译单元.预处理会间接包含其他文件还会展开宏调用.每个编译单元编译成目标文件后会暴露自己内部的符号.(比如有个fun函数,就会暴露出于fun函数对应的符号,其他的函数和变量也是一样的.但是也有不会暴露出去的,比如加了static修饰的函数或变量)每个目标文件都有自己的符号导入表和符号导出表.链接器根据自己所需要的符号去找其他的目…
1.找到以下文件 C:\Windows\Microsoft.NET\Framework\v3.5\Microsoft.CompactFramework.Common.targets 2.用记事本打开该文件,找到以下节点,按照加粗亮底的部分,修改后保存. <Target Name="PlatformVerificationTask" Condition="'$(SkipPlatformVerification)' == 'true'" > <Plat…
1.gcc安装 rpm -qa|grep gcc ==>检查gcc是否安装 gcc -v ==>检查gcc版本 yum -y install gcc ==>安装gcc  2.基本语法 gcc最基本的用法是:gcc [options] [filenames] 说明:如果已经为最新的目标文件,则不重新编译.使用示例test.c源码如下: #include <stdio.h> int main(void) { printf("Hello world/n"); r…
C语言的编译链接过程要把我们编写的一个c程序(源代码)转换成可以在硬件上运行的程序(可执行代码),需要进行编译和链接.编译就是把文本形式源代码翻译为机器语言形式的目标文件的过程.链接是把目标文件.操作系统的启动代码和用到的库文件进行组织,形成最终生成可执行代码的过程.过程图解如下:…
静态库 有时候需要把一组代码编译成一个库,这个库在很多项目中都要用到,例如libc就是这样一个库, 我们在不同的程序中都会用到libc中的库函数(例如printf),也会用到libc中的变量(例如以后 要讲到的environ变量).本文将介绍怎么创建这样一个库. 这些文件的目录结构是: $ tree . |-- main.c `-- stack |-- is_empty.c |-- pop.c |-- push.c |-- stack.c `-- stack.h 1 directory, 6 f…