首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C++程序编译之谜(一)——文件编译的奇怪现象

1、奇怪的现象 在C++文件编译的时候,很多人都会经常碰见这样的一种情况,在一个cpp文件中调用另一个cpp文件的函数,那么可以直接调用吗?我们来做个试验。...首先我们要明白一下,像C/C++、java等高级语言编译生成可执行文件是要经历预处理、编译、汇编、链接这几个过程,像以上三个文件,头文件仅仅只参与到预处理过程,将cal.h的内容包含到另外两个cpp文件中...,而另外两个cpp文件是要经历编译、汇编生成机器语言的二进制文件,也就是说两个cpp都会各自生成各自的二进制文件。...但是这个还没完,要生成可执行文件,还要将以上cpp文件生成的二进制文件进行链接起来,并且有个文件中还要提供一个main函数入口,因为C++语言的可执行文件的入口是main函数,不提供的话程序无法运行。...如果在Linux平台上要清楚的展现,就是以下这几个语句: gcc -c main.cpp //会生成main.o文件 gcc -c add.cpp //会生成add.o文件 gcc main.o

12810

linux中把.c文件编译成.so文件

linux中共享库以so为后缀(shared object),与Windows下的DLL类似,是在程序运行时动态连接。多个进程可以连接同一个共享库。...以下以编译mylib.c为例讲如何编译.so文件。 首先,编译mylib.c: $gcc -c -fPIC -o mylib.o mylib.c -c表示只编译(compile),而不连接。...-o选项用于说明输出(output)文件名。gcc将生成一个目标(object)文件mylib.o。 注意-fPIC选项。PIC指Position Independent Code。...生成共享库: $gcc -shared -o mylib.so mylib.o 库文件以lib开始。共享库文件以.so为后缀。-shared表示生成一个共享库。...总结 以上所述是小编给大家介绍的linux中把.c文件编译成.so文件,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对ZaLou.Cn网站的支持!

9.2K93
您找到你想要的搜索结果了吗?
是的
没有找到

c语言内部函数、外部函数文件编译总结(vs2015编译环境)

2.外部函数 在定义函数时使用关键字extern修饰,则称其为外部函数,可供其他文件调用,其定义格式为: extern int fun(int a,int b) 说明: (1)C语言规定,如果定义函数时省略...(2)在调用本文件外部函数时,声明时可以省略extern,而调用其他文件的外部函数时要使用extern来修饰作为声明。 二、文件编译 ? 上图是官方的方法。...1.首先我们要搞清楚编译的规则,作为新手的笔者就因为不懂这个规则,搞了几天才搞懂。 (1)所有源文件(.c)都参加编译,所有头文件(.h)都不参加编译。   ...(2)#include“文件”在编译时把文件占领#include。   (3)#include“文件”和#include的区别: ?...2.一般,我们把不同的函数写在不同的源文件中,然后在头文件中声明这些源文件中的函数,最后在主函数所在的源文件中include头文件即可。

1.1K31

Linux编译C++

创建C++编译环境 安装VIM PLUS 为什么安装VIM PLUS: 可以为我们提供良好的编译环境,高亮代码,智能提示等等~ git clone https://github.com/chxuan...此事将被报告的异常) 1)此时脚本开始运行 2)选择python3解释编译ycm文件 此时脚本文件会问你是选择python2还是python3来编译ycm文件?...LLDBLLDB(Low Level Debug)是Apple正在迁移的LLVM工具套件(包括Clang)的一部分具有REPL (Read-Eval-Print Loop,交互式解释器)、C++ 和 Python...,int *b); VimPlus如图所示: g++ -g main.cpp func.cpp -o out 我们详细描述一下这条指令的执行过程 g++ main.cpp 相当于g++ -c...main.cpp 目的是生成机器码文件即main.o和func.o(这里有个误区,小白往往把**.o**文件当初可执行文件,这是绝对错误的!!!)

22.8K50

Linux 内核】编译 Linux 内核 ⑤ ( 查看 .config 编译配置文件 | 正式编译内核 )

文章目录 一、查看 .config 编译配置文件 二、正式编译内核 一、查看 .config 编译配置文件 ---- 在上一篇博客 【Linux 内核】编译 Linux 内核 ④ ( 打开 Linux...内核编译 菜单配置 |菜单配置中的光标移动与选中状态 | 保存配置 | 配置项帮助文档 ) 中 , 已经将编译配置保存到了 .config 文件中 ; 查看 .config 编译配置文件 , 在 linux...内核源码根目录中 , 执行 gedit .config 命令 , 查看 .config 编译配置文件 : ( 也可以使用 vi , vim 等文本编辑器查看 ) 在 .config 配置中 , #...代表注释 , CONFIG_IRQ_WORK=y 等号右侧的 y 表示同意该操作 ; .config 文件内容示例 : 配置文件很多 , 这里只贴出一部分 ; # # Automatically generated...---- 在 Linux 内核源码根目录 , 执行 sudo make j4 开始编译 Linux 内核 ;

11.8K40

Linux C++编译和链接

Linux系统中最常用的编译器是g++,这是来自Free Software Foundation的GUN C++编译器。Linux的多数版本都包含该编译器,但并不一定总会安装它。...g++编译器的工作方式很像标准UNIX编译器。...例如,下面的命令将生成可执行文件a.out g++ spiffy.cxx 有些版本可能要求来链接C++库: g++ spiffy.cxx -lg++ 要编译多个源文件,只需将它们全部放到命令行中即可:...g++ my.cxx precious.cxx 这将生成一个名为a.out的可执行文件和两个目标代码文件my.o和precious.o。...如果接下来修改了其中的某个源代码文件,如mu.cxx,则可以使用my.cxx和previous.o来重新编译: g++ my.cxx precious.o GUN编译器可以在很多平台上使用,包括基于Windows

2.4K30

Linux笔记】Linux编译C语言程序

在上一篇笔记中有分享Linux下的vi/vim编辑器的使用方法(【Linux笔记】Vi/Vim编辑器),现在我们就可以使用vi/vim编辑器编写C代码了。那么写完代码该怎么进行编译呢?...首先,使用命令gcc -v查看当前的Linux发行版是否有安装gcc编译器(PS:本文使用的Linux发行版是红帽6): ? 使用vi/vim编辑器写代码并保存为hello.c: ?...然后使用gcc进行编译: ? 其中,编译生成的可执行文件默认为 a.out 。...关于文件的权限修改的具体的方法可以查看往期笔记:【Linux笔记】文件的权限 编译时可以使用 -o 参数修改编译生成的可执行文件的名称。如: ?...以上就是在Linux编译C程序的基本方法,适用于源文件不多的情况。后续的笔记中还会分享其他编译方法,欢迎持续关注!如果你觉得对你有用的话,麻烦帮忙点个赞。

12.4K10

预处理指令、typedef、条件编译文件代码

文件代码 预处理:执行预处理指令,修改源代码。 编译:将预处理后的源代码转换为二进制目标文件。 链接:将需要用到的目标文件合并成可执行文件。...对于源文件来说,编译器是单个独立编译的,并生成对应的目标文件。 例如: main.c 经过编译后,生成目标文件 main.obj 。...print.c 经过编译后,生成目标文件 print.obj 。 编译完成后,将会启动链接器。...更复杂的文件代码 #include typedef struct { char name[20 + 1]; int gender; double height; double...虽然,文件person.h中的函数声明没有必要出现在文件person.c中,但是,这样做并不碍事。 文件代码小结 源文件person.c: 函数定义。

1K40

预处理指令、typedef、条件编译文件代码

图片 文件代码 预处理:执行预处理指令,修改源代码。 编译:将预处理后的源代码转换为二进制目标文件。 链接:将需要用到的目标文件合并成可执行文件。...对于源文件来说,编译器是单个独立编译的,并生成对应的目标文件。 例如: main.c 经过编译后,生成目标文件 main.obj 。 print.c 经过编译后,生成目标文件 print.obj 。...文件 main.c void print(const char* str); int main() { print("Hello World\n"); return 0; } 这样,在编译main.c...更复杂的文件代码 #include typedef struct { char name[20 + 1]; int gender; double height; double...虽然,文件person.h中的函数声明没有必要出现在文件person.c中,但是,这样做并不碍事。 文件代码小结 源文件person.c: 函数定义。

1.2K00

linux 编译 c或cpp 文件为动态库 so 文件(最简单直观的模板)

把源码编译打包为动态库so文件,做平台的可能对这些不熟悉。 对我们这些算是经常用到的。 总结个模板,一看就懂的那种,提供给有需要的人。 前提条件,机器上有 gcc工具链。...如果文件个数少,可以直接单个编译,如下: Building shared lib......注:在linux上,源文件的函数或方法前,不需要声明 __declspec(dllexport) 在WIn32上才需要。...函数在编译的时候就必须确定参数个数,并且调用者必须严格的控制参数的生成,不能,不能少,否则返回后会出错。...2、__cdecl是CC++程序的缺省调用方式。每一个调用它的函数都包含清空堆栈的代码,所以产生的可执行文件大小会比调用_stdcall函数的大。函数采用从右到左的压栈方式。

5.3K40

Objective-C文件编译过程

简介 Objective-C文件编译过程主要包括clang前端的预处理、编译、后端优化中间表示、生成汇编指令、链接、生成机器码这几个步骤。...比如宏定义、条件编译文件包含。...如下命令可以对.c、.m源文件进行预处理,其中参数-E就是对源文件进行预处理操作: clang -E xxx.m 如果我们的.m文件中import(文件包含)了其他的文件或者其他的库,执行以上命令对OC...-E -fobjc-arc -c main.m -o main.o 编译 词法分析 编译器中负责将程序分解为一个一个符号的部分,一般称为“词法分析器”(引用自《C Traps and Pitfalls...xcrun clang -fmodules -c main.c -o main.o 链接 链接器把编译产生的.o文件和(dylib,a,tbd)文件,生成一个mach-o文件

9.3K40
领券