G++编译链接的那些事】的更多相关文章

语言 CPP 前言   虽然 VSCodeC++ 编辑器非常受大家的欢迎,无论是大佬还是小白都说对其爱不释手...   我...用了一段时间后发现实在是麻烦,配置往往花费我大量时间.可以说真的是吃力不讨好(个人观点,不代表其他人)!所以,用了一段时间后我又默默的用起了自己的 HBuilderX !   淦! HBuilderX 不是主力前端吗?额~是的,CPP在这里不是很受宠,但没关系啊(主要是真的好用)!CPP的基本语法还是支持的,再加上自己完善了一下"自定义CPP代码块"后更是如虎…
摘要:编译&链接对C&C++程序员既熟悉又陌生,熟悉在于每份代码都要经历编译&链接过程,陌生在于大部分人并不会刻意关注编译&链接的原理.本文通过开发过程中碰到的四个典型问题来探索64位linux下C++编译&链接的那些事. 编译原理: 将如下最简单的C++程序(main.cpp)编译成可执行目标程序,实际上可以分为四个步骤:预处理.编译.汇编.链接,可以通过 g++ main.cpp –v看到详细的过程,不过现在编译器已经把预处理和编译过程合并. 预处理:g++ -…
本文将有以下4个部分来讲如何使用g++编译调用dll的c++代码. 1.如何调用dll 2.动态链接和静态链接的区别 3.g++的编译参数以及如何编译调用dll的c++代码 4.总结 1.如何调用dll 动态链接库(Dynamic Link Library),简称DLL.DLL 是一个包含可由多个程序同时使用的代码和数据的库.它允许程序共享执行特殊任务所必需的代码和其他资源,一般来说,DLL是一种磁盘文件,以.dll..DRV..FON..SYS和许多以.EXE为扩展名的系统文件都可以是DLL.…
在Windows下使用习惯了IDE,导致我们对程序的编译链接没有一个清晰的认识,甚至混淆了编辑器和编译器的概念.在学习Linux时,这些问题就暴露出来了. 实际上,我们应该严格区分一个程序从产生到执行的整个过程:写代码->编译->链接->可执行程序. 1 写程序 严格来说,无论我们是否在IDE中写程序,我们都相当于在一个记事本上写了一个.txt文件.在进行编译之前,我们写的程序就是一堆文字而已,并没有什么逻辑关系而言,这一点很重要!!! 即使在Windows中,在VS中写c++程序,所提…
一.编译方式的示例详解 1. 编译C代码 代码如下:main.c /*!  ******************************************************************************  * \File  *   main.c  * \Brief  *   C codes  * \Author  *   Hank  *******************************************************************…
gcc/g++ 编译与链接 编译与链接的过程可以分解为四个步骤:预处理.编译.汇编.链接 预处理:源代码文件和相关的头文件,被预处理器cpp预处理成一个后缀为 .i 的文件(选项:-E) 编译:把预处理完的文件进行一系列的词法分析.语法分析.语义分析以及优化后,产生相应的汇编代码文件,后缀为 .s,(选项 :-S ) 汇编:把编译阶段生成的 .s 文件转成二进制目标代码,后缀为.o,(选项:-c) 链接:把每个源代码模块独立地编译,然后按照要将它们"组装"起来.链接的主要内容就是把各个…
添加运行时共享库目录 运行使用共享库的程序需要加载共享库(不同于G++ 编译时指定的链接库),添加共享库的步骤: 修改文件 /etc/ld.so.conf 添加共享库目录 运行 ldconfig 同步更新一下 如: $ gedit /etc/ld.so.conf #添加 /root/dreamlove/lib $ ldconfig 添加include,lib的搜寻路径 对所有用户有效修改/etc/profile 对个人有效则修改~/.bashrc #在PATH中找到可执行文件程序的路径. exp…
Microsoft Visual Studio 2015社区版提供了强大的开发体验,且 Qt 提供了预编译版本.然而,由于客户提出兼容Windows XP ~ Windows 8.1 这样宽泛的环境要求,使得我们不得不考虑更换工具链.经过反复对比测试,在Mingw32, Cygwin,  MSYS2, Visual Studio 2010几个工具链中,综合性能.未来的可持续性.中文支持以及第三方库支持(比如qwt),认为MSYS2较为合适.在后续复杂的迁移过程中,基本是平顺的,但也遇到了一些问题…
在windows环境下,我们通常在IDE如VS的工程中开发C++项目,对于生成和使用静态库(*.lib)与动态库(*.dll)可能都已经比较熟悉,但是,在linux环境下,则是另一套模式,对应的静态库(*.a)与动态库(*.so)的生成与使用方式是不同的.刚开始可能会不适应,但是用多了应该会习惯这种使用,因为步骤上并没有VS下配置那么繁琐.下面就分别总结下linux下生成并使用静态库与动态库的方法:(由于是C++项目,所以编译器用的g++,但是与gcc的使用是相通的) 首先是准备工作,把我们需要…
测试程序test.cpp如下所示: #include <iostream> using namespace std; #define MAX 9 int main() { //just for test cout << MAX << endl; cout << "Hello world!" << endl; } g++编译主要分为四个阶段进行,即预处理(Preprocessing).编译(Compilation).汇编(Ass…
C++编程中相关文件后缀 1.单个源文件生成可执行程序 下面是一个保存在文件 helloworld.cpp 中一个简单的 C++ 程序的代码: /* helloworld.cpp */ #include <iostream> int main(int argc,char *argv[]) { std::cout << "hello, world" << std::endl; ); } 程序使用定义在头文件 iostream 中的 cout,向标准输出…
除非明确说明,本文内容仅针对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的参数…
g++编译&&gdb调试&&coredump调试 一.编译注意细节 1.使用g++编译CPP文件如果用gcc编译C++源文件时,加以下选项:-lstdc++,否则使用了C++操作的文件编译会出错. 2.gcc/g++ 在执行编译时,需要4步 ①   预处理,生成.i的文件[使用-E参数] ②   将预处理后的文件把转换成汇编语言,生成文件.s[使用-S参数] ③   由汇编变为目标代码(机器代码)生成.o的文件[使用-c参数] ④   连接目标代码,生成可执行程序[使用-o…
在Linux里面混了一个多月,vim编程用得甚爽.无奈前天将Linux里面的编程文件夹误删,而技术不精无法找回,悲痛欲绝.再者,无限怀念windows里面的游戏,并觉得现在在Linux里面也学不到什么东西,遂决定回到windows. 回到windows里面第一件事就是想把Linux里面的vim完美移植到windows.花了两天功夫,大部分功能已基本能够实现.当中遇到的最大困难是在windows里面实现用gcc/g++编译调试c/cpp文件,现在就把我这个过程完整记录下来. 1,首先下载安装Min…
gcc和g++现在是gnu中最主要和最流行的c&c++编译器.g++是c++的命令,以.cpp为主:对于c语言后缀名一般为.c,这时候命令换做gcc即可.编译器是根据gcc还是g++来确定是按照C标准还是C++标准编译链接. gcc和g++都是GNU(组织)的一个编译器.但两者有一些区别:后缀为.c的文件gcc把它当做c程序,g++当做c++程序.后缀为c++的两者都当做c++程序.对于cpp程序,无论gcc或者是g++编译阶段都是相同的,都是用的gcc进行编译,但是在链接阶段gcc不能自动和c…
1.   序 最近在折腾各种.so,碰到了一些问题,一开始对于很多错误也没有头绪,茫然不知所措.索性化了一天多时间将<<程序员的自我修养—链接.装载与库>>中部分内容略读了一遍,主要是关于编译,链接和加载这块的.于是顺便做个笔记,方便以后回顾.基本上知道了这些,对于编译,链接和加载过程中产生的各种问题,应该就能从根本上理解并解决了.其实以前上学时也看过那本经典的<<Linker and loader>>,当时还写了篇<<链接器和加载器原理>…
前言 一直以来对Linux下编译链接产生的问题没有好好重视起来,出现问题就度娘一下,很多时候的确是在搜索帮助下解决了BUG,但由于对原因不求甚解,没有细细研究,结果总是在遇到在BUG时弄得手忙脚乱得. 甚至有时候为了一个问题查了半天的资料,好不容易解决了,却因为没有记录下来或者没有弄清楚真实原因,结果第二次碰到还是要去重复前次的折腾,很是尴尬无奈. 虽然,同样的错误信息,其产生的原因不一而足,但是,总结一下终归是好的,使不知变知之,只要不在同一件事情上重复同样的错误,发现的问题越多,解决的问题越…
几个星期以前开始折腾在我的MBA上写 OpenGL 小程序.我不太熟悉MacOS上的开发工具比如XCode,所以一开始的想法就是用vim来写程序,然后手工编译链接.网上查了一下,MacOS上的OpenGL编译选项跟 windows 和 Linux 上的很不一样, 不是用 -I 来指定头文件搜索路径,用-l来链接库文件.MacOS SDK把一些应用库包装成了所谓的“Framework”,其中就包括OpenGL,GLUT 和 Cocoa.所以MacOS下的OpenGL程序(我用到了GLUT)是这样编…
gcc和g++都是GNU(组织)的一个编译器.        误区一:gcc只能编译c代码,g++只能编译c++代码      两者都可以,但是请注意:      1.后缀为.c的,gcc把它当作是C程序,而g++当作是c++程序:后缀为.cpp的,两者都会认为是c++程序,注意,虽然c++是c的超集,但是两者对语法的要求是有区别的.C++的语法规则更加严谨一些.      2.编译阶段,g++会调用gcc,对于c++代码,两者是等价的,但是因为gcc命令不能自动和C++程序使用的库联接,所以通…
gdb调试c程序打不到断点的原因可能是编译c文件的时候没有加-g选项,-g选项是编译加debug信息的,不加是打不到断点的 g++编译cpp文件 g++ -g -c *.cpp       编译 g++ -g -o exec *.o   链接 或 g++ *.cpp -o exec g++编译生成.a 静态库文件,.so为动态库 gcc *.cpp -lcp-demangle -o exec 选项 -l (ell) 通过添加前缀 lib 和后缀 .a 将跟随它的名字变换为库的名字 libcp-d…
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…
单个源文件生成可执行程序 下面是一个保存在文件 helloworld.cpp 中一个简单的 C++ 程序的代码: /* helloworld.cpp */ #include <iostream> int main(int argc,char *argv[]) { std::cout << "hello, world" << std::endl; return(0); } 程序使用定义在头文件 iostream 中的 cout,向标准输出写入一个简单的…
静态库 有时候需要把一组代码编译成一个库,这个库在很多项目中都要用到,例如libc就是这样一个库, 我们在不同的程序中都会用到libc中的库函数(例如printf),也会用到libc中的变量(例如以后 要讲到的environ变量).本文将介绍怎么创建这样一个库. 这些文件的目录结构是: $ tree . |-- main.c `-- stack |-- is_empty.c |-- pop.c |-- push.c |-- stack.c `-- stack.h 1 directory, 6 f…
一直用windows一键搞定, 没有去了解详细的编译链接过程, 今天看了一篇文章, 顺便实验和记录在Linux下逐步生成的步骤. 预处理: 执行#include, #define, #if, #ifdef等预处理指令 把宏展开 编译: 把源文件编译为汇编语言文件 对所有常量表达式(只包含常量的表达式)求值发生在此阶段(不是预处理阶段) 汇编: 把汇编语言文件翻译称为机器语言指令 链接: 连接器就负责处理合并各种用到的*.o, 比如用到的printf函数就会连接printf.o, 结果就得到一个可…
1 编译链接过程分为 预处理--->编译---->汇编---->链接.如下图所示 2 预处理都做了什么 (1)将所有的#define删除并展开所有的宏 (2)处理所有的条件预编译指令比如#if #ifdef (3)处理#Incldue预编译指令,将包含的文件插入到预编译的文件中.采用头文件的目的是可以供多个不同的cpp源程序使用.自己定义的通常用“”,如果包含库文件的一般是“<>”. (4)过滤所有的注释符号 (5)添加行号和文件标识.方便再编译器产生调试用的行号信息等 (6…
出现的问题: 在使用 make 编译实现一个程序时,出现了下面的错误.查看程序源文件所在的目录时发现程序已经完成了编译,并生成了 list_repo.o 的文件,说明是在程序链接生成可执行文件时发生了问题. storages/local.o:在函数‘LocalStorage::init(std::map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >,…
一般编译链接c++程序最好使用g++,若有如上的报错信息,需要在gcc后加上 -lstdc++ eg: gcc test.c -lstdc++ gcc和g++都是GNU的一个编译器. g++:后缀.c的程序和.cpp的程序都会当成是c++的源程序来处理. gcc:会把.c的程序处理成c程序. 对于.cpp的程序,编译可以用gcc/g++,链接可以用g++或者gcc -lstdc++.…
文件目录结构体为: src 和include 分别用来存放.cpp文件和 .hpp文件 其中:src文件夹下有需要的文件 simulator_client.cpp crc32.cpp : include文件夹下有对应的头文件 simulator_client.hpp.crc32.h及使用的头文件cJSON.h 使用命令编译时遇到如下问题: g++ simulator_client.cpp  -o simulator_client -lm -I../include/tmp/ccZ5rfZQ.o:…
Linux静态库和动态库的命名规则 静态函数库 静态库的名字一般是libxxx.a,利用静态库编译生成的文件比较大,因为整个静态库所有的数据都会被整合进目标代码中. a) 优点: 编译后,可执行文件不需要外部支持: b) 缺点: 生成的可执行程序大:静态库改变了,就需要重新编译可执行程序. 动态函数库 动态库的名字一般是libxxx.so,相对于静态库,动态函数库在编译的时候并没有被编译进目标代码中,你的程序执行到相关函数时才调用函数库里面相应的函数,因此使用动态函数库生成的可执行文件比较小.由…
转载:https://www.cnblogs.com/battlescars/p/cpp_linux_gcc.html 1.单个源文件生成可执行程序 下面是一个保存在文件 helloworld.cpp 中一个简单的 C++ 程序的代码: 1 /* helloworld.cpp */ 2 #include <iostream> 3 int main(int argc,char *argv[]) 4 { 5 std::cout << "hello, world" &…