热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

C++基础学习之3-编译器

编译器(Compiler)是指将一种语言翻译为另一种语言的工具,对于C++来讲,是将我们写的代码语言转换为二进制语言(EXE或者ELF),从而能够在Windows或者Linux下

        编译器(Compiler) 是指将一种语言 翻译为另一种语言的工具,对于C++来讲,是将我们写的代码语言 转换为二进制语言(EXE或者ELF),从而能够在Windows或者Linux下运行。

        很多新同学可能对编译器并不敏感,直接用 IDE(VS、Eclipse)编译一下就可以了,没有感觉到编译器的存在,这其实就是一个问题,作者建议对于初学者尽量不要直接就用 IDE,先用 Linux命令,然后 逐渐过渡到 Vim、Emacs、Sublime等,最后才考虑用 IDE。

        我们先来看一下 GCC 和 G++

sudo apt-get install g++
sudo apt-get install gcc
        一般来讲,GCC与G++打包在一起,对于 Ubuntu 14.04 默认安装的是 4.8.4 版本,当然也可以根据自己的需要进行升级。

        GCC和G++有什么区别呢?

1. GCC是C程序编译器,将.C的后缀文件按照C语言格式编译,将.CPP文件按照C++语言格式编译;

    G++是C++编译器,在编译.C文件时调用GCC,编译.CPP文件时按照C++编译;

    错误观点:GCC只能编译C代码,G++只能编译C++代码。

2. 由于GCC无法链接C++库(但可以链接纯C),因此,对于C++链接这个工作就交给了G++;

    错误观点:编译用GCC,链接用G++。

3. GCC不会定义__cplusplus宏,而G++会;

        看一下Linux下的命令行编译的例子(sh文件build):

#!/bin/bashSRC=`ls *.cpp`LIBS=`ls /usr/local/lib/libopencv*.so`g++ -I./include $SRC -o main $LIBS

        list所有的cpp文件,加载lib库(例子对应的是opencv),G++调用编译(-o 生成目标文件 main)。

> GCC Compile

gcc -o hello hello.c -I/home/include -L/home/lib -lworldCORE_LIBS="$CORE_LIBS -L/usr/lib64/mysql -Wl,-Bstatic -lmysqlclient \ -Wl,-Bdynamic -lz -lcrypt -lnsl -lm -L/usr/lib64 -lssl -lcrypto"

    -static      # to find .a

    -shared   # to find .o (default)

    用到的两个选项: -Wl,-Bstatic 和 -Wl,-Bdynamic  告诉链接器,对接下来的-l选项使用静态链接 or 动态链接。


Make与CMake

        Make是GNU 针对复杂的编译过程开发的一个调度器,通过MakeFile文件 实现编译选项的控制、用户交互等操作。

CC = g++SRC = `ls *.cpp`TARGET = main    $(CC) -I./include $SRC -o $(TARGET)clean:    rm main

        这是一个简单的 makefile 例子,很容易看懂,在命令行输入make,调用g++进行编译,输入clean,完成清理。

        虽然写 makefile 是程序员的必备技能,但是 有时候文件太多、逻辑太复杂,并不能够对Solution进行有效管理,基于这种考虑,CMake诞生了。

        CMake 能够生成 makefile,所以我们把它看作是上层工具,目前CMake使用较广的原因作者认为有两点:

1. CMake 对大型工程的管理更为简单,虽然也需要借助 CMakeLists.txt 文件,但维护工作量大大减少;

2. CMake 有比较好的可视化工具,这堪称利器,不解释。

        同样来看一个CMake的例子:

#////////////////////////////////////////////#project目录下的CMakeLists.txt#///////////////////////////////////////////CMAKE_MINIMUM_REQUIRED(VERSION 2.8)#工程名PROJECT(CMakeTest)#工程文件中使用相对路径SET(CMAKE_SUPPRESS_REGENERATION 1)SET(CMAKE_USE_RELATIVE_PATHS ON)#支持IF(A) ELSE()的写法SET(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS ON)#定义工程的顶级路径SET(PROJDIR ${CMAKE_CURRENT_SOURCE_DIR})#定义源文件目录SET(SRCDIR ${PROJDIR}/src)#设置输出路径SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/build)SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/build)#设置安装路径SET(CMAKE_INSTALL_PREFIX ${PROJDIR}/build)#定义头文件安装目录SET(PROJ_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/headers)#根据操作系统不同而设置不同的路径IF(WIN32) SET(GDAL_HDRS "E:/lib/gdal/include")ELSE() SET(GDAL_HDRS "/home/sunsc/gdal/")ENDIF()#设置头文件的引用路径INCLUDE_DIRECTORIES( ${GDAL_HDRS})#设置引用库路径SET(LIBS ${LIBRARY_OUTPUT_PATH})LINK_DIRECTORIES(${LIBS})#宏,实现visio studio的目录分组(过滤器)功能macro(source_group_by_dir source_files)    if(MSVC)        set(sgbd_cur_dir ${CMAKE_CURRENT_SOURCE_DIR})        foreach(sgbd_file ${${source_files}})            string(REGEX REPLACE ${sgbd_cur_dir}//(.*/) //1 sgbd_fpath ${sgbd_file})            string(REGEX REPLACE "/(.*/)/.*" //1 sgbd_group_name ${sgbd_fpath})            string(COMPARE EQUAL ${sgbd_fpath} ${sgbd_group_name} sgbd_nogroup)            string(REPLACE "/" "//" sgbd_group_name ${sgbd_group_name})            if(sgbd_nogroup)                set(sgbd_group_name "//")            endif(sgbd_nogroup)            source_group(${sgbd_group_name} FILES ${sgbd_file})        endforeach(sgbd_file)    endif(MSVC)endmacro(source_group_by_dir)#添加子目录ADD_SUBDIRECTORY(src)
        除了 Make 和 CMake 之外,很多人也会用到 qmake,这里我们不再继续展开讨论,而对于 VS 对应的编译器,大家可以与 G++ 进行比较,发现其相同与不同之处,这对于编译器的理解很有好处。

        当然 如果你有兴趣自己写一个编译器的话,那将是非常有挑战的!


推荐阅读
  • 本文探讨了在Linux Ubuntu环境下为Windows CE设备(如Jornada 720)开发和编译C++命令行程序的方法与实践。通过详细的技术步骤和环境配置,展示了如何有效地利用Linux平台进行跨平台的嵌入式开发,提供了实用的解决方案和优化建议。 ... [详细]
  • 如何在Linux环境中高效地创建、编译与运行C语言代码
    本文面向第一次在linux尝试写C语言程序的新人。有经验的请绕行。C语言用法不是本文介绍的关键,本文只是引入如何第一次在linux系统下编写、编译和执行一个简单的c程序。学会后请自行深入 ... [详细]
  • Lunix历史及如何学习
    1.Lunix是什么1.1Lunix是操作系统还是应用程序Lunix是一套操作系统,它提供了一个完整的操作系统当中最底层的硬件控制与资源管理的完整架构, ... [详细]
  • 深入解析 ELF 文件格式与静态链接技术
    本文详细探讨了ELF文件格式及其在静态链接过程中的应用。在C/C++代码转化为可执行文件的过程中,需经过预处理、编译、汇编和链接等关键步骤。最终生成的可执行文件不仅包含系统可识别的机器码,还遵循了严格的文件结构规范,以确保其在操作系统中的正确加载和执行。 ... [详细]
  • Python与R语言在功能和应用场景上各有优势。尽管R语言在统计分析和数据可视化方面具有更强的专业性,但Python作为一种通用编程语言,适用于更广泛的领域,包括Web开发、自动化脚本和机器学习等。对于初学者而言,Python的学习曲线更为平缓,上手更加容易。此外,Python拥有庞大的社区支持和丰富的第三方库,使其在实际应用中更具灵活性和扩展性。 ... [详细]
  • 如何将PHP文件上传至服务器及正确配置服务器地址 ... [详细]
  • 利用PaddleSharp模块在C#中实现图像文字识别功能测试
    PaddleSharp 是 PaddleInferenceCAPI 的 C# 封装库,适用于 Windows (x64)、NVIDIA GPU 和 Linux (Ubuntu 20.04) 等平台。本文详细介绍了如何使用 PaddleSharp 在 C# 环境中实现图像文字识别功能,并进行了全面的功能测试,验证了其在多种硬件配置下的稳定性和准确性。 ... [详细]
  • 在 Linux 系统中,`/proc` 目录实现了一种特殊的文件系统,称为 proc 文件系统。与传统的文件系统不同,proc 文件系统主要用于提供内核和进程信息的动态视图,通过文件和目录的形式呈现。这些信息包括系统状态、进程细节以及各种内核参数,为系统管理员和开发者提供了强大的诊断和调试工具。此外,proc 文件系统还支持实时读取和修改某些内核参数,增强了系统的灵活性和可配置性。 ... [详细]
  • 掌握DSP必备的56个核心问题,我已经将其收藏以备不时之需! ... [详细]
  • 手机上编写和运行PHP代码的最佳软件推荐 ... [详细]
  • 对于以压缩包形式发布的软件,其目录中通常包含一个配置脚本 `configure`。该脚本的主要功能是确定编译所需的各项参数,如头文件的位置和链接库的路径,并生成相应的 `Makefile` 以供编译使用。通过运行此脚本,开发者可以确保软件在不同环境下的正确编译与安装。此外,该脚本还能够检测系统依赖项,进一步提高编译过程的可靠性和兼容性。 ... [详细]
  • 在Linux/WSL环境中,本文对Shell任务的并行处理进行了详细的测试与分析。通过多种并行处理技术,如GNU Parallel和xargs,探讨了如何有效提升任务执行效率和系统资源利用率。实验结果表明,合理配置并行参数能够显著缩短任务完成时间,提高系统整体性能。此外,文章还介绍了Shell脚本编写的基本原则和最佳实践,为读者提供了实用的参考。 ... [详细]
  • 如何在Linux系统中部署TensorFlow的详细指南
    本文详细介绍了在Linux系统中部署TensorFlow的过程。作者基于北京大学曹建教授的MOOC课程进行学习,但由于课程内容较旧,环境配置方面遇到了不少挑战。经过多次尝试,最终成功解决了这些问题,并总结了一套详细的安装指南,帮助初学者快速上手TensorFlow。 ... [详细]
  • 从无到有,构建个人专属的操作系统解决方案
    操作系统(OS)被誉为程序员的三大浪漫之一,常被比喻为计算机的灵魂、大脑、内核和基石,其重要性不言而喻。本文将详细介绍如何从零开始构建个人专属的操作系统解决方案,涵盖从需求分析到系统设计、开发与测试的全过程,帮助读者深入理解操作系统的本质与实现方法。 ... [详细]
  • 在Linux环境下编译安装Heartbeat时,常遇到依赖库缺失的问题。为确保顺利安装,建议预先通过yum安装必要的开发库,如glib2-devel、libtool-ltdl-devel、net-snmp-devel、bzip2-devel和ncurses-devel等。这些库是编译过程中不可或缺的组件,能够有效避免编译错误,确保Heartbeat的稳定运行。 ... [详细]
author-avatar
隔壁老吴
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有