zoukankan      html  css  js  c++  java
  • 静态编译C/C++程序

    静态编译C/C++程序,让程序运行不受平台限制

    由于Linux操作系统的特有elf加载顺序. (可以参考此文). 虽然可以很大程度上解决Windows早期版本的dll hell问题, 但是给部署带来了很大难度

    一般常见的解决方法是, 找到一个与目标Linux版本及glibc版本一致的Linux, 将代码及依赖包放在之上编译, 完成后再发布.这种方法与Linux下常见软件安装方法类似. 但是对于商用服务器部署步骤来说未免繁琐, 安全性低.

    还有一种方法,使用静态链接. 将所有可执行文件文件依赖的静态库, 系统库,全部静态链接到可执行文件中,可以一次性解决这个问题

    步骤:

        1. 在gcc链接命令行中添加-static -static-libgcc -static-libstdc++

        2. 将第三方依赖库打开静态链接开关, 将原来链接.so的库,全改为链接.a

        3. gcc对链接库顺序很敏感, 链接库顺序需要按照从前至后为:  项目产生的静态库 > 第三方库静态库 > 系统静态库

        4. 链接时, 若有未解决的symbol, 可以尝试在最后添加-lpthread及-lrt解决

       

    在发布版本Linux上运行可能遇到的问题:

    terminate called after throwing an instance of 'std::runtime_error'

    what(): locale::facet::_S_create_c_locale name not valid

    解决方法: 执行之前运行export LC_ALL="C"

  • 相关阅读:
    poj 3252 Round Numbers 数位DP
    HDU5840 Problem This world need more Zhu 分块 树剖
    有向图强连通分量
    CodeForces
    Gym-100814K 数位DP 模拟除法
    洛谷P3455 [POI2007]ZAP-Queries
    洛谷P2257 YY的GCD
    洛谷P3327 [SDOI2015]约数个数和(莫比乌斯反演)
    莫比乌斯反演
    小知识点
  • 原文地址:https://www.cnblogs.com/yorkyang/p/6668745.html
Copyright © 2011-2022 走看看