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"

  • 相关阅读:
    USB
    Google
    机型参数
    mac
    反编译
    xcode
    Ios 消息推送
    真机:特殊
    Android
    object-c
  • 原文地址:https://www.cnblogs.com/yorkyang/p/6668745.html
Copyright © 2011-2022 走看看