zoukankan      html  css  js  c++  java
  • 基本概念(1)——编译器

    c++的编译器常见的有g++、clang++、msvc

    • 编译器会自带stl标准库和标准c库,编译器都会有默认自带的搜索路径,c++标准库的头文件和lib、dll等就在编译器的默认搜索路径中

    gcc系列

    gcc是最经典的编译器,windows中安装gcc可以通过:
    1、安装qt,qt自带mingw版本的gcc
    2、mingw,手动安装mingw
    3、msys64
    4、cgwin
    等等方式
    我的电脑上安装了qt和msys64,msys64目录下的g++搜索路径如下

    整理一下

    macos bigsur安装gcc可以通过homebrew

    可以看到有很多版本,比如安装9.x


    如果是Ubuntu,则可以通过apt命令安装gcc
    默认安装最新版本,可以通过sudo apt install gcc-7这种方式指定版本。
    安装之后可以通过软连接方式连接到gcc、g++

    clang

    https://releases.llvm.org/download.html
    找到官方编译的二进制包:

    下载安装,32位和64位只能安装一个,安装过程中可以选中自动添加到环境变量

    安装完之后编译器和调试器就都有了

    搜索路径

    stl等c++自带的库就在这些目录里

    msvc

    安装vs之后可以得到的工具有:编译器cl、链接器link.exe、nmake

    本机编译器与目标程序

    windows系统兼容x86和x64程序,所以编译器(本身就是个软件)可以是x86也可以是x64,于是微软提供了两个版本,分别在Hostx64个Hostx86文件夹中
    C:Program Files (x86)Microsoft Visual Studio2019CommunityVCToolsMSVC14.28.29333in

    Hostx64是本机的x64编译器
    Hostx86是本机x86编译器
    进入Hostx64,里面有4种目标平台

    调用Hostx64arm目录下的cl.exe就是调用本机x64编译器交叉编译生成target是arm的软件

    本机x86 和x64编译器
    target arm、arm64、x86、x64
    这就存在交叉编译的几种组合选择,微软提供了几个脚本方便使用
    C:Program Files (x86)Microsoft Visual Studio2019CommunityVCAuxiliaryBuild


    查看vcvarsall.bat可以看到
    amd64和x64实际一样
    target(目标机器x64)host(本机环境x86)

    命令行使用编译工具

    不想在vs中使用cl等工具可以在命令行直接调用cl.exe但是有些初始化参数要添加,为了方便实用微软也提供了脚本,安装完vs会有

    其实也都是去调用脚本给给定一些参数最终去调用某个目录下的cl.exe、link.exe工具

    cl命令行参数 https://docs.microsoft.com/zh-cn/cpp/build/reference/compiler-options-listed-alphabetically?view=msvc-160

    参考msdn https://docs.microsoft.com/zh-cn/cpp/build/building-on-the-command-line?view=msvc-160

    各种版本

    同样是vs2019的vc编译器,又可以安装很多版本(版本号不同)

    如果安装vs的时候还安装了vs2015的编译器,那么还可以用vs2015的编译器

    MT(d)与MD(d)

    带d的是debug版本,不带d是release版本

    各编译器之间的兼容性

    gcc(exe版本)、clang、msvc这些编译器之间的兼容性并不好,msvc编译得到的dll或者lib使用gcc调用是会不兼容的。
    这也是为什么qt的dll为什么会提供好几个版本了,如下图

    windows开发使用msvc编译器会更好,因为可以使用的其他第三方组件更多,毕竟他们多数都是msvc编译得到的。

    为编译器引入第三方库

    ide

    以vs为例,使用vs创建的工程,会自动添加一些引用路径,比如vs创建的一个工程,在项目的属性页面:

    “包含路径”也就是include的路径,该工程如下
    C:Program Files (x86)Microsoft Visual Studio2019CommunityVCToolsMSVC14.28.29333include
    C:Program Files (x86)Microsoft Visual Studio2019CommunityVCToolsMSVC14.28.29333atlmfcinclude
    C:Program Files (x86)Microsoft Visual Studio2019CommunityVCAuxiliaryVSinclude
    C:Program Files (x86)Windows Kits10Include10.0.19041.0ucrt
    C:Program Files (x86)Windows Kits10Include10.0.19041.0um
    C:Program Files (x86)Windows Kits10Include10.0.19041.0shared
    C:Program Files (x86)Windows Kits10Include10.0.19041.0winrt
    C:Program Files (x86)Windows Kits10Include10.0.19041.0cppwinrt
    C:Program Files (x86)Windows KitsNETFXSDK4.8Includeum

    “库目录”是寻找lib的目录
    C:Program Files (x86)Microsoft Visual Studio2019CommunityVCToolsMSVC14.28.29333libx86
    C:Program Files (x86)Microsoft Visual Studio2019CommunityVCToolsMSVC14.28.29333atlmfclibx86
    C:Program Files (x86)Microsoft Visual Studio2019CommunityVCAuxiliaryVSlibx86
    C:Program Files (x86)Windows Kits10lib10.0.19041.0ucrtx86
    C:Program Files (x86)Windows Kits10lib10.0.19041.0umx86
    C:Program Files (x86)Windows KitsNETFXSDK4.8libumx86

    gcc

    头文件

    gcc 在编译时寻找所需要的头文件 :
    ※搜寻会从-I开始(gcc 参数,指定头文件搜索位置)
    ※然后找gcc的环境变量 C_INCLUDE_PATH,CPLUS_INCLUDE_PATH,OBJC_INCLUDE_PATH

    ※再找内定目录
    /usr/include
    /usr/local/include
    /usr/lib/gcc-lib/i386-linux/2.95.2/include
    /usr/lib/gcc-lib/i386-linux/2.95.2/../../../../include/g++-3
    /usr/lib/gcc-lib/i386-linux/2.95.2/../../../../i386-linux/include

    但是如果装gcc的时候,是有给定的prefix的话,那么就是
    /usr/include
    prefix/include
    prefix/xxx-xxx-xxx-gnulibc/include
    prefix/lib/gcc-lib/xxxx-xxx-xxx-gnulibc/2.8.1/include

    库文件dll
    编译的时候:
    ※gcc会去找-L
    ※再找gcc的环境变量LIBRARY_PATH
    ※再找内定目录 /lib:/usr/lib: /usr/local/lib:这是当初compile gcc时写在程序内的

    msvc

  • 相关阅读:
    安装IDEA
    缓存工具CacheUtil
    使用Eclipse上传/下载Git项目
    Sublime文本排序&查找重复行&删除重复行
    Sublime Text 3 配置Java开发
    安装XMind
    安装Maven
    安装MySQL
    安装Eclipse及相关Plugin
    Android Xposed框架中创建模块的指导手册
  • 原文地址:https://www.cnblogs.com/feipeng8848/p/14306384.html
Copyright © 2011-2022 走看看