一、编译方式的示例详解

1. 编译C代码


代码如下:main.c


/*!


 ******************************************************************************


 * \File


 *   main.c


 * \Brief


 *   C codes


 * \Author


 *   Hank


 ******************************************************************************


 */


#include <stdio.h>

int main(int argc, char* argv[])


{


  int a = 4;


  int b = 3;


  int ret = 0;

ret = add(a,b);


  printf(" %d + %d = %d\n",a,b,ret);


  return;


}

int add(int a, int b)


{


  return (a + b);


}

1.1 用gcc编译:


$ gcc -Wall -g main.c -o gcc_compile_c


main.c: In function 'main':


main.c:20: warning: implicit declaration of function 'add'


main.c:23: warning: 'return' with no value, in function returning non-void

运行:


$ ./gcc_compile_c


 4 + 3 = 7

1.2. 用g++编译


代码如上所示


$ g++ -Wall -g main.c -o g++_compile_c  


main.c: In function 'int main(int, char**)':


main.c:20: error: 'add' was not declared in this scope


main.c:23: error: return-statement with no value, in function returning 'int'

改成如下:


#include <stdio.h>

int add(int a, int b)


{


  return (a + b);


}

int main(int argc, char* argv[])


{


  int a = 4;


  int b = 3;


  int ret = 0;

ret = add(a,b);


  printf(" %d + %d = %d\n",a,b,ret);


  return 0;


}

编译运行:


$ g++ -Wall -g main.c -o g++_compile_c


$ ./g++_compile_c


 4 + 3 = 7

可见,C++的规则检查强于C;

2. 编译C++代码


代码如下: main.cpp


#include <iostream>


/*!


 ******************************************************************************


 * \File


 *   main.cpp


 * \Brief


 *   C++ source code


 * \Author


 *   Hank


 ******************************************************************************


 */


#include <iostream>


using namespace std;

class Arithmetic


{


  private:


    int m_iVarA;


    int m_iVarB;

public:


    int add();


    int sub();


    int mul();


    int div();


    int mod();

public:


    Arithmetic();


    Arithmetic(int, int);


    ~Arithmetic();

};

int main(int argc, char* argv[])


{


  int a = 4, b = 3;


  int ret = 0;

Arithmetic arith(a, b);


  ret = arith.add();


  cout<<a<<" + "<<b<<" = "<<ret<<endl;


  return 0;


}

Arithmetic::Arithmetic(int a, int b):m_iVarA(a),m_iVarB(b)
{}

Arithmetic::~Arithmetic()


{


  m_iVarA = 0;


  m_iVarB = 0;


}

int Arithmetic::add()                                                                                                                                 


{                                                                                                                                                     


  return (m_iVarA + m_iVarB);                                                                                                                         


}


2.1 用gcc编译


$ gcc -Wall -g -lstdc++ main.cpp -o gcc_compile_c++


$ ./gcc_compile_c


4 + 3 = 7

2.2 用g++编译


$ g++ -Wall -g main.cpp -o g++_compile_c++


$ ./g++_compile_++


4 + 3 = 7

3. 编译 C++代码中含有C语言的代码


代码main.cpp


/*! 


 ****************************************************************************** 


 * \File 


 *   main.cpp 


 * \Brief 


 *   C++ source code 


 * \Author 


 *   Hank 


 ****************************************************************************** 


 */ 


#include <iostream> 


using namespace std;


class Arithmetic


{


  private:


    int m_iVarA;


    int m_iVarB;


  


  public:


    int add();


    int sub();


    int mul();


    int div();


    int mod();

public:


    Arithmetic();


    Arithmetic(int, int);


    ~Arithmetic();


};

extern "C" int add(int, int);


int main(int argc, char* argv[])


{


  int a = 4, b = 3;


  int ret = 0;

Arithmetic arith(a, b);


  ret = add(a, b);


  cout<<a<<" + "<<b<<" = "<<ret<<endl;


  return 0;


}

int add(int a, int b)


{


  return (a + b);


}

Arithmetic::Arithmetic(int a, int b):m_iVarA(a),m_iVarB(b)
{}

Arithmetic::~Arithmetic()


{


  m_iVarA = 0;


  m_iVarB = 0;  


}

int Arithmetic::add()


{


  return (m_iVarA + m_iVarB);


}

3.1 用gcc编译


$ gcc -Wall -g -lstdc++ main.cpp -o gcc_compile_cINc++


$ ./gcc_compile_cINc++ 


4 + 3 = 7

3.2 用g++编译


$ gcc -Wall -g  main.cpp -o g++_compile_cINc++


$ ./g++_compile_cINc++ 


4 + 3 = 7

二、各种库的编译链接方式示例详解


1. C语言代码链接调用C语言库


库代码文件:


/*!                                                                                 


 ******************************************************************************     


 * \File                                                                            


 *   arith.h                                                                        


 ******************************************************************************     


 */


#ifndef __ARITH_H__                                                                 


#define __ARITH_H__                                                                 


int add(int a, int b);                                                              


#endif

/*!


 ******************************************************************************     


 * \File


 *   arith.c


 ******************************************************************************     


 */                                                                                 
 


#include "arith.h"   
                                                               


int add(int a, int b)                                                               


{ 


  return (a + b);                                                                   


}

调用库的代码:


/*!


 ******************************************************************************


 * \File


 *   main.c


 * \Brief


 *   C codes


 * \Author


 *   Hank


 ******************************************************************************


 */


#include <stdio.h>


#include <stdlib.h>


#include <dlfcn.h>


#include "arith.h"

int main(int argc, char* argv[])


{


  int a = 4;


  int b = 3;


  int ret = 0;

// 加载动态库


  void *p_Handler = dlopen("./arith.so", RTLD_NOW);


  if (!p_Handler)


  {


    printf("%s\n",dlerror());


    exit(1);


  }

// 引入接口函数


  char *error;


  typedef int (*arith_add)(int, int);


  arith_add pf_add_interface;


  pf_add_interface = (arith_add)dlsym(p_Handler, "add");


  error = dlerror();


  if (error)


  {


    printf("%s\n", error);


    exit(1);


  }


  


  // 调用


  ret = pf_add_interface(a,b);

printf(" %d + %d = %d\n",a,b,ret);


  dlclose(p_Handler); // 关闭句柄


  return 0;


}

1.1 gcc实现


生成库:


$ gcc -Wall -g -fPIC -o arith.so -shared arith.c

生成可执行文件:


$ gcc -Wall -g -rdynamic -ldl main.c -o compile_cLIBc


$ ./compile_cLIBc


3 + 4 = 7


 


1.2 g++实现


生成库:


$ g++ -Wall -g -fPIC -o arith.so -shared arith.c

生成可执行文件:


$ g++ -Wall -g -rdynamic -ldl main.c -o compile_cLIBc


$ ./compile_cLIBc


3 + 4 = 7

2. C++代码链接调用C++库


请参见文章《linux下C++动态链接C++库》详解

3. C++代码链接调用 C语言库


请参见文章《linux下C++动态链接C语言库》详解

gcc与g++的编译链接的示例详解的更多相关文章

  1. gcc/g++等编译器 编译原理: 预处理,编译,汇编,链接各步骤详解

    摘自http://blog.csdn.net/elfprincexu/article/details/45043971 gcc/g++等编译器 编译原理: 预处理,编译,汇编,链接各步骤详解 C和C+ ...

  2. Spring Boot 2.x 快速入门(下)HelloWorld示例详解

    上篇 Spring Boot 2.x 快速入门(上)HelloWorld示例 进行了Sprint Boot的快速入门,以实际的示例代码来练手,总比光看书要强很多嘛,最好的就是边看.边写.边记.边展示. ...

  3. python中的tcp示例详解

    python中的tcp示例详解  目录 TCP简介 TCP介绍 TCP特点 TCP与UDP的不同点 udp通信模型 tcp客户端 tcp服务器 tcp注意点   TCP简介   TCP介绍 TCP协议 ...

  4. Python爬虫之爬取淘女郎照片示例详解

    这篇文章主要介绍了Python爬虫之爬取淘女郎照片示例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 本篇目标 抓取淘宝MM ...

  5. libCURL开源库在VS2010环境下编译安装,配置详解

    libCURL开源库在VS2010环境下编译安装,配置详解 转自:http://my.oschina.net/u/1420791/blog/198247 http://blog.csdn.net/su ...

  6. jquery移除、绑定、触发元素事件使用示例详解

    这篇文章主要介绍了jquery移除.绑定.触发元素事件使用示例详解,需要的朋友可以参考下. unbind(type [,data]) //data是要移除的函数 $('#btn').unbind(&q ...

  7. 史上最易懂——ReactNative分组列表SectionList使用详情及示例详解

    React Native系列 <逻辑性最强的React Native环境搭建与调试> <ReactNative开发工具有这一篇足矣> <解决React Native un ...

  8. VS2010 Chart控件(一)Chart控件在ASP.NET网站中的应用示例详解(C#语言)

    步骤如下: 1. Chart控件(一)Chart控件在ASP.NET网站中的应用示例详解(C#语言)" title="VS2010 Chart控件(一)Chart控件在ASP.NE ...

  9. socket编程的同步、异步与阻塞、非阻塞示例详解

     socket编程的同步.异步与阻塞.非阻塞示例详解之一  分类: 架构设计与优化 简介图 1. 基本 Linux I/O 模型的简单矩阵 每个 I/O 模型都有自己的使用模式,它们对于特定的应用程序 ...

随机推荐

  1. 如何判断微信内置浏览器(通过User Agent实现)

    在进行微信公众账号开发的时候,其中很大一块是微站点的开发,我们需要知道当前的浏览器是微信内置的浏览器,那么如何判断呢? 微信内置浏览器的 User Agent 如何判断微信内置浏览器,首先需要获取微信 ...

  2. 如何让Gridview在没有数据的时候显示表头(asp.net)

    原文:如何让Gridview在没有数据的时候显示表头(asp.net) 1.前言 当对GridView控件进行数据绑定时,如果绑定的记录为空,网页上就不显示GridView,造成页面部分空白,页面布局 ...

  3. IOC 在Mvc中的使用

    IOC 在Mvc中的使用 IOC,是控制反转(Inversion of Control)的英文简写, 控制反转一般分为两种类型,依赖注入(Dependency Injection)和依赖查找(Depe ...

  4. php 链接中加参数传递

    原文:php 链接中加参数传递 php链接中加参数是在源链接中加"?",问号之后就可以跟参数列表,para1=value1&para2=value2&para3=v ...

  5. 快速构建Windows 8风格应用28-临时应用数据

    原文:快速构建Windows 8风格应用28-临时应用数据 本篇博文主要介绍临时应用数据概览.如何构建临时应用数据. 一.临时应用数据概览 临时应用数据相当于网页中缓存,这些数据文件是不能够漫游的,并 ...

  6. 通过 C# 代码操作 Google 日历

    原文:通过 C# 代码操作 Google 日历 本文主题 借助 Google .NET APIs Client Library,通过 C# 代码在 Google 日历中创建会议邀请. 本文背景 最近, ...

  7. OCP-1Z0-051-题目解析-第4题

    4. Which two statements are true regarding single row functions? (Choose two.) A. They a ccept only ...

  8. AjaxPro使用说明文档

    ajaxpro下载地址 AjaxPro使用说明     1 目录     2 修改历史纪录     3 1.什么是Ajax     4 2.为什么使用Ajax     4 3.Ajax应用场景     ...

  9. 通过localstorage和cookie实现记录文章的功能

    我们在做页面的时候,会考虑记录用户曾经看过的文章的功能,并记录下来在页面中显示!但是在IE低版本的下是不支持localstorage的功能,只能采用cookie来代替本地存储的功能!实现的方法如下! ...

  10. UVA11125 - Arrange Some Marbles(dp)

    UVA11125 - Arrange Some Marbles(dp) option=com_onlinejudge&Itemid=8&category=24&page=sho ...