精华内容
参与话题
问答
  • Regex-2.7 for Windows 这个不用我说了吧,大家都知道,...libregex.dll.a可以静态编译(编译时提示:warning LNK4078: 找到多个“.text”节,它们具有不同的特性(E0000020)),可以摆脱dll,但是运行几秒后程序就崩了
  • 1.由于博创杯开发板的不可更改性,所以导致的结果是什么呢?那就是无法动态连接,还有一个需要注意的是,板子上面上面用的是4.4.1的gcc,一旦你Ubuntu使用的开发板高于它,都有可能导致运行程序失败,这就是程序失败...
    
    

    2.Linux 应用开发通常要考虑三个问题,即:1)在 Linux 应用程序开发过程中遇到过标准库链接在不同 Linux 版本下不兼容的问题; 2)在 Linux 静态库的制作过程中发现有别于 Windows 下静态库的制作方法;3)在 Linux 应用程序链接第三方库或者其他静态库的时候发现链接顺序的烦人问题。本文就这三个问题针对 Linux 下标准库链接和如何巧妙构建 achrive(*.a) 展开相关介绍。
      两个要知道的基本知识
      Linux 应用程序因为 Linux 版本的众多与各自独立性,在工程制作与使用中必须熟练掌握如下两点才能有效地工作和理想地运行。
      1、Linux 下标准库链接的三种方式(全静态 , 半静态 (libgcc,libstdc++), 全动态)及其各自利弊。
      2、Linux 下如何巧妙构建 achrive(*.a),并且如何设置链接选项来解决 gcc 比较特别的链接库的顺序问题。
      三种标准库链接方式选项及对比
      为了演示三种不同的标准库链接方式对最终应用程序产生的区别, 这里用了一个经典的示例应用程序 HelloWorld 做演示,见 清单 1 HelloWorld。
      清单 1. HelloWorld
    #include <stdio.h>
    #include <iostream>
    using std::cout;
    using std::endl;
    int main(int argc, char* argv[])
    {
    printf("HelloWorld!(Printed by printf)\n");
    cout<<"HelloWorld!(Printed by cout)"<<endl;
    return 0;
    }
      三种标准库链接方式的选项及区别见 表 1
      表 1. 三种标准库链接方式的选项及区别
      上述三种标准库链接方式中,比较特殊的是 半静态链接方式,主要在于其还需要在链接前增加额外的一个步骤:
      ln -s g++ -print-file-name=libstdc++.a,作用是将 libstdc++.a(libstdc++ 的静态库)符号链接到本地工程链接目录。
      -print-file-name 在 gcc 中的解释如下:
      -print-file-name=<lib> Display the full path to library <lib>
      为了区分三种不同的标准库链接方式对最终生成的可执行文件的影响,本文从两个不同的维度进行分析比较:
      维度一:最终生成的可执行文件对标准库的依赖方式(使用 ldd 命令进行分析)
      ldd 简介:该命令用于打印出某个应用程序或者动态库所依赖的动态库
      涉及语法:ldd [OPTION]… FILE…
      其他详细说明请参阅 man 说明。
      三种标准库链接方式最终产生的应用程序的可执行文件对于标准库的依赖方式具体差异见 图 1、图 2、图 3所示:
      
    图 1. 全静态标准库链接方式
      图 2. 全动态标准库链接方式
      图 3. 半静态(libgcc,libstdc++) 标准库链接方式
      通过上述三图,可以清楚的看到,当用 全静态标准库的链接方式时,所生成的可执行文件最终不依赖任何的动态标准库,
      而 全动态标准库的链接方式会导致最终应用程序可执行文件依赖于所有用到的标准动态库。
      区别于上述两种方式的 半静态链接方式则有针对性的将 libgcc 和 libstdc++ 两个标准库非动态链接。
      (对比 图 2与 图 3,可见在 图 3中这两个标准库的动态依赖不见了)
      从实际应用当中发现,最理想的标准库链接方式就是半静态链接,通常会选择将 libgcc 与 libstdc++ 这两个标准库静态链接,
      从而避免应用程序在不同 Linux 版本间标准库依赖不兼容的问题发生。
      维度二 : 最终生成的可执行文件大小(使用 size 命令进行分析)
      size 简介:该命令用于显示出可执行文件的大小
      涉及语法:size objfile…
      其他详细说明请参阅 man 说明。
      三种标准库链接方式最终产生的应用程序的可执行文件的大小具体差异见 图 4、图 5、图 6所示:
      
    图 4. 全静态标准库链接方式
      图 5. 全动态标准库链接方式
      图 6. 半静态(libgcc,libstdc++) 标准库链接方式
      通过上述三图可以看出,最终可执行文件的大小随最终所依赖的标准动态库的数量增加而减小。
      从实际应用当中发现,最理想的是 半静态链接方式,因为该方式能够在避免应用程序于
      不同 Linux 版本间标准库依赖不兼容的问题发生的同时,使最终生成的可执行文件大小最小化。
      示例链接选项中所涉及命令(引用 GCC 原文):
      -llibrary
      -l library:指定所需要的额外库
      -Ldir:指定库搜索路径
      -static:静态链接所有库
      -static-libgcc:静态链接 gcc 库
      -static-libstdc++:静态链接 c++ 库
    展开全文
  • 大佬们,怎样把libc.a的内容静态编译进动态库里呀?比如我动态库里有一个printf,我要怎么把printf静态编译进去?   **就比如我编写了一个.c文件,我想把它编译成共享库,在我这个.c中我使用了printf函数...
  • 易语言破解版5.11(可静态编译

    千次下载 热门讨论 2011-10-09 14:18:18
    易语言破解版5.11(可静态编译)易语言5.1是一个自主开发,适合国情,不同层次不同专业的人员易学易用的汉语编程语言。易语言降低了广大电脑用户编程的门槛,尤其是根本不懂英文或者英文了解很少的。。。。。。。。...
  • 另外一种是静态编译,编译成功之后,程序只需要拷贝一个exe,就可以在其他电脑上运行。 我这里想要的就是第二种方法。以下两篇文章介绍的方式已尝试,但没成功。 http://www.th7.cn/Program/c/201406/220528.shtml ...
  • 内核源码树的目录下都有两个文档Kconfig和Makefile。分布到各目录的Kconfig构成了一个分布式的内核配置数据库,每个Kconfig分别描述了所属...在内核编译时,主Makefile调用这个.config,就知道了用户的选择。 上面的内

    内核源码树的目录下都有两个文档Kconfig和Makefile。分布到各目录的Kconfig构成了一个分布式的内核配置数据库,每个Kconfig分别描述了所属目录源文档相关的内核配置菜单。在内核配置make menuconfig时,从Kconfig中读出菜单,用户选择后保存到.config的内核配置文档中。在内核编译时,主Makefile调用这个.config,就知道了用户的选择。

    上面的内容说明了,Kconfig就是对应着内核的配置菜单。假如要想添加新的驱动到内核的源码中,能够修改Kconfig,这样就能够选择这个驱动,假如想使这个驱动被编译,要修改Makefile。所以,添加新的驱动时需要修改的文档有两种(注意不只是两个)*Kconfig,*Makefile

    .config是make menuconfig【配置后生成的一个配置文件,也就是说可以拷贝一个别人配置好的.config来使用,内核中不同开发板也自带了一些配置文件在arch/arm/config/目录下面有很多配置文件可以选择和自己单板相似。

    第一种方法:

    利用内核自身的Makefile特性来编译我们的驱动程序,下面由一个简单的hello.c驱动程序来说明。

    在/drivers/char/目录下写hello.c  修改Makefile,Kconfig

    hello.c内容:
    #include <linux/init.h>           /* 初始化模块所用到的头文件 */
    #include <linux/module.h>   /* KERN_ALERT用到的 头文件*/

    static int hello_init(void)      /* 入口函数,加载驱动程序所调用的函数 */

    {
            printk(KERN_ALERT"Hello, world\n");
            return 0;
    }


    static void hello_exit(void)     /* 出口函数 ,卸载驱动程序所调用的函数 */
    {

            printk(KERN_ALERT"Goodbye, cruel world\n");
    }

    module_init(hello_init);
    module_exit(hello_exit);

    MODULE_LICENSE("Dual BSD/GPL");   /* 通用的协议 */

    MODULE_AUTHOR("wangluoren");     /* 作者 */

    MODULE_DESCRIPTION("A simple hello world module");   /* 程序描述 */

    MODULE_ALIAS("A simplest module");             /* 别名 */


    Kconfig内容:
    config HELLO           /* Makefile中编译可变选项中宏的名字,作用就是定义一个可以选择的变量 */
    tristate "Hello Driver added by Dong"        /* make menuconfig 菜单界面显示的信息,tristate 提供Y M N三种选项 */
    default n           /* 菜单选项默认为N */
    help
       test for adding driver to menuconfig.     /* 一些帮助信息,写不写没有关系 */


    MakeFile内容: 
    obj-$(CONFIG_HELLO) += hello.o     /*CONFIG_HELLO我们在Kconfig中区定义它,我们用 HELLO ,hello是文件名字*/

    到此为止我们就写好了这个hello的驱动程序,然后我们可以make menuconfig 在

    Device Drivers  --->

     Character devices  --->

    < > Hello Driver added by Dong   /* 可以按空格选择Y M N ,来分别 编译进内核,模块,不编译*/

    如果是直接编译进内核就可以执行make uImage ,如果是编译成模块就执行make modules.


    上面我们采用的是静态编译方法看起来是那么的麻烦,当我们写驱动程序的时候如果采用这种方法的话那就够折腾了,我估计你调试一个驱动程序你都得折腾大半天,这种方法是我们确定我们驱动程序没有问题后在编译进内核。

    第二种方法:

    一般我们采用动态编译来写驱动程序,具体方法如下:

    还是拿hello.c程序为例:

    hello.c内容:
    #include <linux/init.h>           /* 初始化模块所用到的头文件 */
    #include <linux/module.h>   /* KERN_ALERT用到的 头文件*/

    static int hello_init(void)      /* 入口函数,加载驱动程序所调用的函数 */

    {
            printk(KERN_ALERT"Hello, world\n");
            return 0;
    }


    static void hello_exit(void)     /* 出口函数 ,卸载驱动程序所调用的函数 */
    {

            printk(KERN_ALERT"Goodbye, cruel world\n");
    }

    module_init(hello_init);
    module_exit(hello_exit);

    MODULE_LICENSE("Dual BSD/GPL");   /* 通用的协议 */

    MODULE_AUTHOR("wangluoren");     /* 作者 */

    MODULE_DESCRIPTION("A simple hello world module");   /* 程序描述 */

    MODULE_ALIAS("A simplest module");             /* 别名 */


    Makefile文件编写如下:(和hello.c放在同一层目录就OK)

    KERN_DIR = /home/book/workspace/kernel/linux-3.4.2_jz2440   /* 虚拟机kernel的路径,每个人不一样 */

    all:
            make -C $(KERN_DIR) M=`pwd` modules   /* -C 表示进入后面KERN_DIR这个目录把当前路径的hello.c编译成模块*/

    clean:
            make -C $(KERN_DIR) M=`pwd` modules clean  /* 一些清除工作,清除中间生成的中间文件 */
            rm -rf modules.order
    obj-m   += hello.o                        /* 编译,这里要注意这个hello是你要编译的程序的文件名字 */ 


    上面两种方法编译完成后都会生成一个hello.ko的文件,我们把这个文件复制到开发板的目录下面,执行如下命令      insmod hello.ko  就会打印:Hello, world

    rmmod hello    就会打印  Goodbye, cruel world  (这个是一一对应的,加载一次只能卸载一次,不能重复加载)


    补充一:

    动态加载补充一点:如果我要用一个Makefile同时编译多个文件该怎么办呢?(这个文件的一个函数在另外一个文件当中定义,我们可以采取如下方法)方法如下:

    有来个驱动文件:hello.c  hello1.c

    我们可以把上面Makefile中obj-m +=hello.o改成如下命令就可以了

    obj-m :=led.o
    module-objs :=hello.o hello1.o   /* 这时候生成的 驱动文件就是led.ko */


    补充二:

    如果同时又两个驱动程序都需要编译(两者之间没有任何联系的,就是共同用kernel来编译自己的驱动)

    比如有两个文件:hello1.c  hello2.c 

    我们可以在同一个Makefile中这样来编写:

    obj-m+=hello1.o
    obj-m += hello2.o    (注意这个:=已经变成+=,这两者的区别这里就不说明了)


    补充三:

    上面静态编译驱动我们采用的是在/drivers/char目录下面添加一个文件,我们也可以在/drivers目录下面添加一个文件夹,下面我们讲讲具体的怎么来实现。

    我们在/drivers目录下面添加一个hello的文件夹,里面创建一个hello.c,Kconfig,Makefile,这个三个文件和静态编译添加一个文件是完全相同的,主要是更改的是/drivers目录下的Makefile和Kconfig文件。

    Makefile中添加如下命令:

    obj-$(CONFIG_HELLO) += hello/        /* CONFIG_HELLO这个宏定义在hello目录里面的Kconfig中,‘/’表示进入这个目录,调用子目录Makefile来编译子目录中的文件 */

    Kconfig添加如下命令:

    source "drivers/hello/Kconfig"     /* 把Kconfig导出到子菜单界面 */

    然后执行make modules   就在drivers/hello目录下面生成了一个hello.ko的文件

    现在这个驱动编译的全部用法基本讲解完毕,有了这些知识你自己都可以去分析内核的结构,从顶层Makefile开始分析,子目录下的Makefile想对简单的多,顶层Makefile是比较难的,顶层Makefile讲解在这篇文章中,请点击这里!


    上面讲解了一些基础的知识,这些知识对一个驱动开发成员已经足够了,如果你是工作在内核空间,那你就应该深入分析这些结构的原理,比如怎么添加递归创建子目录,通配符,正则表达式等,你都需要去深入了解。希望我这篇文章能给驱动开发者带来帮助。

    展开全文
  • 需要配置的安装包  apt-get install build-essential libpcap0.8-dev libx11-dev libfreetype6-dev libavahi-gobject-dev libSM-dev libXrender-dev libfontconfig-dev...静态编译Qt 1、下载 qt-x11-ope

    需要配置的安装包 


    apt-get install build-essential libpcap0.8-dev libx11-dev libfreetype6-dev libavahi-gobject-dev libSM-dev libXrender-dev libfontconfig-dev libXext-dev

    静态编译Qt


    1、下载 qt-x11-opensource-4.7.1.tar.gz

    2、解压缩qt-x11-opensource-4.7.1.tar.gz

    3、配置path

        输入命令:export PATH="$PATH:/usr/local/Trolltech/Qt-4.7.1/bin"

    4、进入qt解压目录,配置configure命令:./configure -static -nomake demos -nomake examples -nomake tools -no-exceptions

    5、分别输入“o”和“y”以后进入编译阶段

    6、make

    7、make install

    慢慢等吧……根据电脑配置不同可能编译几小时到几十小时

    静态编译Qt程序


    1、建立文件夹,然后写程序文件XX.cpp

    2、qmake -project
    3、生成pro文件后在里面加入CONFIG += static
    4、qmake 
    5、生成Makefile后在cxxflags的=后插入-static
    6、make

    注意:在程序的main函数前加入程序使用的plugin,否则图片图标显示不正常,文字乱码

    #include <QtPlugin> 
    Q_IMPORT_PLUGIN(qjpeg)
    Q_IMPORT_PLUGIN(qgif)
    Q_IMPORT_PLUGIN(qcncodecs)
    Q_IMPORT_PLUGIN(qico)
    

    最后在工程 pro文件中加入库

    linux下lib*.a既是这些库的静态版本,lib*.so等为动态版本

    LIBS += D:/QT/4.6.0/plugins/imageformats/libqgif.a
    LIBS += D:/QT/4.6.0/plugins/imageformats/libqjpeg.a
    LIBS += D:/QT/4.6.0/plugins/codecs/libqcncodecs.a
    LIBS += D:/QT/4.6.0/plugins/imageformats/libqico.a

    否则编译出现
    undefined reference to `qt_plugin_instance_qico()'等错误
    展开全文
  • qt 静态编译后在一部分电脑上不能运行。 软件测试 winds下qt5.5.1下静态编译了一个软件, 功能: 自己读取一个本地图片, 然后基于udp协议发送给自己, 再在本地接收图片信息,并且显示出来。(软件测试可以...
  • 采用CMakeLists的方式静态编译C++, 该怎么修改CMakeLists.txt文件,能够把执行档需要的所有库都包含到执行档中,这些库有第三方的.so和.a库。 想把所有的.so或者是.a库都打包到执行档中,这样在run的时候不会提示...
  • 静态编译与动态编译

    2012-07-02 21:37:51
    静态编译  静态编译,就是编译器在编译可执行文件的时候,将可执行文件需要调用的对应动态链接库(.so)中的部分提取出来,链接到可执行文件中去,使可执行文件在运行的时候不依赖于动态链接库。 动态编译  是某些...

    静态编译

      静态编译,就是编译器在编译可执行文件的时候,将可执行文件需要调用的对应动态链接库(.so)中的部分提取出来,链接到可执行文件中去,使可执行文件在运行的时候不依赖于动态链接库。

    动态编译

           是某些程式语言在执行时用来增进效能的方法。尽管这技术源于Self但使用此技术最为人所知的是Java。它可以做一些只在执行时才能得知的最佳化。使用动态编译的执行环境 一开始几分钟执行慢,之后,完成大部分的编译和再编译后,会执行快。因为初始效能的延迟,动态编译不适用于一些情况。在许多实作中,一些可以在编译时期做的最佳化被延到执行时期才编译,导致不必要的效能降低。即时编译是一种动态编译的形式。

    静态编译与动态编译的区别

      动态编译的可执行文件需要附带一个的动态链接库,在执行时,需要调用其对应动态链接库中的命令。所以其优点一方面是缩小了执行文件本身的体积,另一方面是加快了编译速度,节省了系统资源。缺点一是哪怕是很简单的程序,只用到了链接库中的一两条命令,也需要附带一个相对庞大的链接库;二是如果其他计算机上没有安装对应的运行库,则用动态编译的可执行文件就不能运行。  静态编译就是编译器在编译可执行文件的时候,将可执行文件需要调用的对应动态链接库(.so)中的部分提取出来,链接到可执行文件中去,使可执行文件在运行的时候不依赖于动态链接库。所以其优缺点与动态编译的可执行文件正好互补。
    展开全文
  • GCC静态编译

    千次阅读 2018-01-05 17:54:22
    GCC 文章转自:...gcc 最初是 "GNU C Compiler" 的简称,只是当作一个 C 语言的编译器,现在已经变成了 "GNU Compiler Collection",可以编译多种语言。     二、编译的四个阶段: 在使
  • Libcurl 静态编译

    千次阅读 2017-10-27 10:07:16
    Libcurl 静态编译一、准备 curl源代码下载,当前使用【curl-curl-7_53_1.zip】版本,编译器使用VS2015 二、编译 打开VS2015 开发人员命令提示,并CD进入 curl-curl-7_53_1/winbuild/ 目录 VS生成代码的时候有一个...
  • QT静态编译

    千次阅读 2010-03-01 15:55:00
    装QT SDK 后,默认采用的是动态链接库的编译方式,如果需要发布程序,需要在可...但是安装的Qt是动态编译的,要生成静态的版本,就需要自己重新进行编译。首先需要修改位于/mkspecs/win32-g++下的qmake.conf,在QMAKE
  • qt静态编译

    万次阅读 2012-12-16 13:46:38
    QT里部署程序有两种方法:一种是动态编译,一种的静态编译 动态编译需要发布.exe程序的同时,附上dll文件,想Qt里的Qtguid4.dll一个就有160M之巨,对于一般的小程序来说,可能只有小小的几M,所以有很多我们根本用...
  • tcpdump静态编译

    千次阅读 2015-12-21 17:37:09
    Cross-Compiling or Building Android tcpdump? Building There are multiple ways of building or compiling Android tcpdump. The one outlined below is the method we use to build the Android tcpdump bi
  • 但在编译过程中却无法选择静态编译,问题参见:https://github.com/alanxz/SimpleAmqpClient/issues/113 原来是作者还没添加该功能。。。 不可能因为这一个库去修改整个客户端程序的编译方式,在没
  • libiconv静态编译

    千次阅读 2015-09-29 13:35:03
    Linux: 1、//配置文件生成Makefile #./configure --prefix=/usr/local/lib --enable-static=yes 注释:prefix要绝对...2、编译生成目标文件 #make 3、把目标文件拷贝到/usr/local/lib #make install 4、清除
  • C++ 静态编译

    千次阅读 2017-01-04 17:20:31
    静态编译静态编译,就是编译器在编译可执行文件的时候,将可执行文件需要调用的对应动态链接库(.so)中的部分提取出来, 链接到可执行文件中去,使可执行文件在运行的时候不依赖于动态链接库 ...
  • opencv静态编译

    千次阅读 2015-12-15 17:56:58
    一、序言 当一个opencv工程实现之后,我们会面临一个问题,怎么把opencv程序的exe在其他电脑上运行,这个问题已经有很多人遇到过,当然也有很多人给出了博客,介绍了具体的解决方法,具体自己操作时,还是遇到了...
  • BOOST静态编译

    千次阅读 2013-03-07 17:45:28
    在做CEGUI+OGRE结合时,提示用到了“libboost_thread-vc80-mt-sgd...然后从网上找了一下资料,原来自带的bjam默认编译不带参数,不是静态库。  以“libboost_thread-vc80-mt-sgd-1_42.lib”为例:  libbo
  • boost静态编译

    2013-05-02 07:55:35
    bjam link=static runtime-link=static
  • BCB 静态编译

    千次阅读 2012-03-13 14:54:13
    编译静态连接库,可以在所有机上运行的程序,只要这样做:打开【project】的【Options】,把packages页中的‘build with runtime packages’的勾去掉,linker页中的‘use dynamic Rtl’的勾去掉,再在compiler页...
  • OpenVC静态编译

    千次阅读 2010-04-06 21:39:00
    开始要要在OpenCV下面编译生成静态链接库。有个比较方便的方法就是,举个例子:cxcore这个文件夹,Release下面它编译成的为cxcore.lib。这个时候我们可以在他的同级目录下面新建一个文件夹cxcorel,新建一个静态库。...
  • gdbserver 静态编译

    千次阅读 2008-01-18 12:52:00
    进行编译。如果采用gdb-6.6,在编译gdbserver时,会出现要求编译器要有libthread_db.a. #tar xjvf gdb-5.2.1.tar.bz2 #cd ./gdb-5.2.1/gdb/gdbserver #chmod +x configure #CC=arm-softfloat-linux-gcc ./

空空如也

1 2 3 4 5 ... 20
收藏数 47,455
精华内容 18,982
关键字:

静态编译