zoukankan      html  css  js  c++  java
  • C/C++ 程序的build过程

    (This article is under constant construction)
    DISCLAIMER: 本文的主要内容来自https://gcc.gnu.org/onlinedocs/gcc/


    这篇随笔主要记录有关build C/C++程序的知识. 包括

    • gcc/g++ 的各个参数的含义
    • 编译, 链接等概念
    • Linux中make的使用
    • 静态/动态链接库
    • Linux的文件系统

    从源文件到可执行文件

    Compilation can involve up to four stages: preprocessing, compilation proper, assembly and linking, always in that order. GCC is capable of preprocessing and compiling several (source) files either into several assembler input files, or into one assembler input file; then each assembler input file produces an object file, and linking combines all the object files (those newly compiled, and those specified as input) into an executable file.

    1. source file(s): preprocessing, compilation proper
    2. assembler input file(s): assembly
    3. object file(s): linking
    4. executable file

    gcc/g++ 编译选项 (options) 的含义

    -c
    Compile or (should be "and"?) assemble the source files, but do not link. The linking stage simply is not done. The ultimate output is in the form of an object file for each source file.

    By default, the object file name for a source file is made by replacing the suffix ‘.c’, ‘.i’, ‘.s’, etc., with ‘.o’.

    Unrecognized input files, not requiring compilation or assembly, are ignored.

    -S
    Stop after the stage of compilation proper; do not assemble. The output is in the form of an assembler code file for each non-assembler input file specified.

    By default, the assembler file name for a source file is made by replacing the suffix ‘.c’, ‘.i’, etc., with ‘.s’.

    Input files that don't require compilation are ignored.

    -E
    Stop after the preprocessing stage; do not run the compiler proper. The output is in the form of preprocessed source code, which is sent to the standard output.

    Input files that don't require preprocessing are ignored.

    -o file
    Place output in file file. This applies to whatever sort of output is being produced, whether it be an executable file, an object file, an assembler file or preprocessed C code.

    If -o is not specified, the default is to put an executable file in a.out, the object file for source.suffix in source.o, its assembler file in source.s, a precompiled header file in source.suffix.gch, and all preprocessed C source on standard output.

    Options for Linking

    These options come into play when the compiler links object files into an executable output file. They are meaningless if the compiler is not doing a link step.

    object-file-name
    A file name that does not end in a special recognized suffix is considered to name an object file or library. (Object files are distinguished from libraries by the linker according to the file contents.) If linking is done, these object files are used as input to the linker.

    -c
    -S
    -E

    If any of these options is used, then the linker is not run, and object file names should not be used as arguments.

    -llibrary

    Search the library named library when linking.

    It makes a difference where in the command you write this option; the linker searches and processes libraries and object files in the order they are specified. Thus, ‘foo.o -lz bar.o’ searches library ‘z’ after file foo.o but before bar.o. If bar.o refers to functions in ‘z’, those functions may not be loaded.

    The linker searches a standard list of directories (details?) for the library, which is actually a file named liblibrary.a. The linker then uses this file as if it had been specified precisely by name.

    The directories searched include several standard system directories plus any that you specify with -L.

    Normally the files found this way are library files—archive files whose members are object files. The linker handles an archive file by scanning through it for members which define symbols that have so far been referenced but not defined. But if the file that is found is an ordinary object file, it is linked in the usual fashion. The only difference between using an -l option and specifying a file name is that -l surrounds library with ‘lib’ and ‘.a’ and searches several directories.

    关于 LD_LIBRARY_PATH 的链接

  • 相关阅读:
    adb检测不到夜神模拟器
    夜神模拟器相关设置
    dos窗口下查看系统环境变量设置,输出dos命令结果到文件
    JavaScript DOM操作案例列表的高亮显示
    JavaScript DOM操作案例美女相册
    JavaScript DOM操作案例阻止超链接跳转
    JavaScript DOM操作案例点击按钮修改ul背景颜色
    Git 状态 untracked 和 not staged的区别
    GitPython模块简介
    解决error: failed to push some refs to 'xxxx'
  • 原文地址:https://www.cnblogs.com/Patt/p/6020399.html
Copyright © 2011-2022 走看看