c 编译链接

首先main是执行的入口,进入main才可以执行,main之外的都是一些全局变量或是函数的定义。

c函数把每一个文件当作一个module对待,既然每一个文件就是一个模块(这个跟paython很像奥),那么模块势必有私有的属性方法和对外提供的属性方法,在c语言中一个文件中的变量和方法如果被extern修饰,那么这说明这个变量是引用的外部的模块的变量,通俗说这个变量就是起码两个模块间的通用变量,如果用static来修饰那么这个变量就是本模块自身的与其他模块不通用。连接器一旦在某一个模块发现一个不被static修饰的变量a,就把他标注在导出符号表中,再在别的模块遇到不被static修饰的a,那么这个a被视为与存在于导出表中的a是一个变量。因此在不同的模块中重复定义单一赋值一个变量按道理是应该被允许的,但是重复赋值就不妙了,因为编译器不能确定哪一个值是准确的值。编译的时候,每一个模块都作为一个独立的个体存在,因此地址可能都是从0x0000开始的,很明显我们需要为每一个模块设置一个偏移量,以确保不同模块中的变量不会地址覆盖,当然了extern的外部变量是不能受本模块的偏移地址影响,他来自哪一个模块就要受那个模块的偏移地址影响。说白了就是当前地址+偏移地址得到一个新地址。

对于.h的由来,猜测一下哈,假设我们写了一个文件a.c里面定义了很多变量,然后我们在b.c中需要用到这些变量,要知道c规定必须先定义才能用啊,虽然a,b我们最终会连接在一起,按道理在一个里面声明了就行了,但是不行,c语言规定变量用之前必须先声明,如果用别的模块的externxx,当然了这个extern可以省略,所以啊我们最终把声明给提取出来,注意按道理讲这个.h中不应该赋值,这是中规范。

具体的原理以后再陆续补上,当下有些累。

时间: 2024-11-04 06:00:29

c 编译链接的相关文章

GCC编译器编译链接

在gcc编译器环境下,常见的文件扩展名的含义如下: .c:C源程序,经过预编译后的源程序也为.c文件,它可以通过-E参数输出. .h:头文件 .s:经过编译得到的汇编程序代码,它可以通过-S参数输出. .o:目标文件 .a:函数库 Gcc编译器常见语法: -c:只进行编译,不进行链接,输出的是与源文件同名的.o文件. -o:指定生成的文件的名称.链接生成可执行文件,这个参数后可以带可执行文件的名字,如果没有指定可执行文件的名字,则会默认为a.out. -S:输出汇编代码文件,输出一个与源文件同名

编译链接总结

1. -L增加一个搜索路径,不一定要跟-l放在一起:不区别静态链接和动态链接. 2. 用-lxx与 libxx.a的区别是:前者会搜索多个路径. 3. 使用-lxx链接动态库时,动态库所在的目录不一定在搜索路径,可以加到/etc/ld.so.conf中,或者/etc/ld.so.conf.d/libxx.conf,并重启ldconfig.(ldd) 4. 动态链接库可以访问可执行程序内定义的函数,动态链接库可以相互访问函数,使用dlopen指定RTLD_GLOBAL. 5. 使用libxx.a与

【转】关于编译链接——gcc/g++

添加运行时共享库目录 运行使用共享库的程序需要加载共享库(不同于G++ 编译时指定的链接库),添加共享库的步骤: 修改文件 /etc/ld.so.conf 添加共享库目录 运行 ldconfig 同步更新一下 如: $ gedit /etc/ld.so.conf #添加 /root/dreamlove/lib $ ldconfig 添加include,lib的搜寻路径 对所有用户有效修改/etc/profile 对个人有效则修改~/.bashrc #在PATH中找到可执行文件程序的路径. exp

C++开始前篇,深入编译链接

C++开始,为什么要写这个东西,因为按照课堂进度的话,现在的C++已经学到模板以及重载了,有时却仍然因为一些小问题无法解答,原因是忘记了开始时学到的知识,深知不能像猴子掰棒子一样,掰一个扔一个,因此,现在踏踏实实的回顾一下.另外希望各位博友们随时指正,不甚感激! 前部分大概分为,1,深入编译链接.2,函数调用堆栈.3,C跟C++的区别.4,面向对象思想...(未完待续) 温故而知新. --------------------------------------------------------

mac 命令行里 编译 链接 出现xcrun: error: active developer&nbs

mac 命令行里 编译 链接 出现xcrun: error: active developer path mac cc 编译出现 xcrun: error: active developer path ("/Volumes/Xcode/Xcode.app/Contents/Developer") does not exist, use xcode-select to change 在命令行里输入 sudo xcode-select -switch /Applications/Xcode

加快XCode的编译链接速度(200%+)—XCode编译速度慢的解决方案

最近在开发一个大项目的时候遇到一个很头疼的问题,由于项目代码较多,每次都要编译链接1分钟左右,调试的时候很浪费时间,于是研究了一下如何提高编译链接的速度,在这里分享给大家. 提升编译链接的速度主要有以下三个方式: 1. 提高XCode编译时使用的线程数 defaults write com.apple.Xcode PBXNumberOfParallelBuildSubtasks 4 XCode默认使用与CPU核数相同的线程来进行编译,但由于编译过程中的IO操作往往比CPU运算要多,因此适当的提升

程序的编译链接过程

还是从HelloWorld开始说吧... #include <stdio.h> int main(int argc, char* argv[]) { printf("Hello World!\n"); return 0; } 从源文件Hello.cpp编译链接成Hello.exe,需要经历如下步骤: 可使用以下命令,直接从源文件生成可执行文件 linux: gcc -lstdc++ Hello.cpp -o Hello.out // 要带上lstdc参数,否则会报undef

关于tcc、tlink的编译链接机制的研究

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,为什么这样也可以呢?我们先尝试在新建立的环境下编译连接一个文件

转载:ios程序编译链接参数 all_load 的 ld duplicate symbol _main 的 bug及修复

转载自:http://www.cnblogs.com/dabaopku/archive/2012/12/12/2813940.html ios程序编译链接参数 all_load 的 ld duplicate symbol _main 的 bug及修复 问题 -all_load 是在Objective-C 编译时常用到的一个参数,比如这篇文章所介绍的,生成静态库的一些问题-all_load.但是我们在加入这个参数后,有时会出现"ld: duplicate symbol _main"的错误

VS编译链接时错误(Error Link2005)的解决方法

近期参与的项目中使用了公司另外一个同事提供的一个静态库文件.该静态库文件集成了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(