精华内容
下载资源
问答
  • Windows下Qt静态编译连接和DLL依赖问题解决
  • Zip文件内存解压 静态编译不带dll文件 支持密码解压,压缩是VS2015工程打包,已封装成类,方便拿去快速调用。全部代码均有注释。
  • 静态编译和动态编译(lib和dll

    千次阅读 2017-09-18 18:41:12
    静态编译lib所谓静态链接就是把函数或过程直接链接到可执行文件中,成为可执行程序中的一部分,当多个程序调用同样的函数时,内存里就会有这个函数的多个拷贝,浪费内存资源 生成lib文件,包含了函数索引以及实现,...

    静态编译lib

    所谓静态链接就是把函数或过程直接链接到可执行文件中,成为可执行程序中的一部分,当多个程序调用同样的函数时,内存里就会有这个函数的多个拷贝,浪费内存资源
    生成lib文件,包含了函数索引以及实现,这个LIB会比较大

    生成和使用静态库
    生成静态库
    新建项目–win32项目–填写项目名–确定–下一步–应用程序类型:选择静态库
    静态库项目没有main函数,也没有像dll项目中的dllmain。
    创建项目后添加.h文件,添加相应的导出函数、变量或类,如下所示

    // .h
    #ifndef _MYLIB_H_
    #define _MYLIB_H_
    
    void fun(int a);
    
    extern int k;
    
    class testclass
    {
    public:
        testclass();
        void print();
    };
    
    #endif
    
    //.cpp文件如下
    #include "stdafx.h"
    #include "lib.h"
    #include <iostream>
    
    void fun(int a)
    {
        std::cout<<a<<"lib gen\n";
    }
    
    int k = 222;
    
    testclass::testclass()
    {
        std::cout<<"123\n";
    }
    
    void testclass::print()
    {
        std::cout<<"this is testcalss\n";
    }//编译工程后就会生成一个.lib文件
    

    使用静态库
    需要.h文件,lib文件
    (1)设置项目属性–vc++目录–库目录为lib所在的路径
    (2)将lib添加到项目属性–链接器–输入–附加依赖项(或者直接在源代码中加入#pragma comment(lib, “**.lib”))
    (3)在源文件中添加.h头文件
    然后就像平常一样调用普通函数、类、变量,举例如下:

    #include <iostream>
    #include "lib.h"
    
    #pragma comment(lib, "lib.lib")
    
    int main()
    {
        fun(4);
        std::cout<<k<<std::endl;
        testclass tc; 
        tc.print();
        return 0;
    }
    

    动态编译dll

    动态链接则是提供了一个函数的描述信息给可执行文件(并没有内存拷贝),当程序被夹在到内存里开始运行的时候,系统会在底层创建DLL和应用程序之间的连接关系,当执行期间需要调用DLL函数时,系统才会真正根据链接的定位信息去执行DLL中的函数代码
    生成dll文件和lib文件,dll包含实现部分,lib包含索引部分

    Dll的调用过程:在WINDOWS32系统底下,每个进程有自己的32位的线性地址空间,若一个DLL被进程使用,则该DLL首先会被调入WIN32系统的全局堆栈,然后通过内存映射文件方式映射到这个DLL的进程地址空间。若一个DLL被多个进程调用,则每个进程都会接收到该DLL的一个映像,而非多份的拷贝。但,在WIN16系统下,每个进程需要拥有自己的一份DLL空间,可以理解为何静态链接没啥区别。
    生成和使用动态库
    生成动态库
    新建项目–win32项目–填写项目名–确定–下一步–应用程序类型:选择dll–附加选项:选择导出符号–完成
    可以看到生成了一个dllmain.cpp 文件,这是dll应用程序的入口,注意它和普通工程的入口main函数不同,这个文件我们不需要修改。
    在这个动态库中我们举例导出一个变量,一个类,一个函数,头文件dll.h如下:

    //mydll.h
    #ifdef MYDLL_EXPORTS
    #define MYDLL_API __declspec(dllexport)
    #else
    #define MYDLL_API __declspec(dllimport)
    #prama comment(lib, "mydll.lib")
    #endif
    
    //1导出变量,变量在.cpp文件中定义
    extern "C" MYDLL_API int ndll;
    
    //2导出函数,加extern "C",是为了保证编译时生成的函数名不变,这样动态调用dll时才能
    //正确获取函数的地址
    extern "C" MYDLL_API int fndll(void);
    
    // 3导出类
    class MYDLL_API Cdll {
    public:
        Cdll(void);
        // TODO: 在此添加您的方法。
    };
    
    // 4(建议使用)导出接口
    class Idll2 {
    public:
        virtual bool func() = 0;
        virtual ~Idll2(void) {};
    };
    
    extern "C" MYDLL_API Idll2* CreateInstance();
    
    //mydll.cpp
    #include "stdafx.h"
    #include "mydll.h"
    
    
    // 这是导出变量的一个示例
    MYDLL_API int ndll=6;
    //
    // 这是导出函数的一个示例。
    MYDLL_API int fndll(void)
    {
        return 42;
    }
    
    // 这是已导出类的构造函数。
    Cdll::Cdll()
    {
        return;
    }
    
    // 导出接口
    class Cdll2:public Idll2
    {
    public:
        bool func(){return 0;}
    };
    
    MYDLL_API Idll2* CreateInstance()
    {
        return new Cdll2;
    }
    

    调用动态库
    有两种方法调用动态库,一种隐式链接,一种显示链接。
    调用动态库:隐式链接
    隐式链接 需要.h文件,dll文件,lib文件
    (1)将dll放到工程的工作目录
    (2)设置项目属性–vc++目录–库目录为lib所在的路径
    (3)(直接在源代码中加入#pragma comment(lib, “**.lib”))或者将lib添加到项目属性–链接器–输入–附加依赖项
    (4)在源文件中添加.h头文件
    然后就像平常一样调用普通函数、类、变量
    调用动态库:显示链接
    显示链接 只需要.dll文件,但是这种调用方式不能调用dll中的变量或者类(其实可以调用类,但是相当麻烦,有兴趣者可参考)
    显示调用主要使用WIN32 API函数LoadLibrary、GetProcAddress,举例如下:

    typedef int (*dllfun)(void);//定义指向dll中函数的函数指针
        HINSTANCE hlib = LoadLibrary("mydll.dll");
        if(!hlib)
        {
            std::cout<<"load dll error\n";
            return -1;
        }
        dllfun fun = (dllfun)GetProcAddress(hlib,"fndll");
        if(!fun)
        {
            std::cout<<"load fun error\n";
            return -1;
        }
        fun();
    

    参考资料:
    http://www.cnblogs.com/lancidie/archive/2011/03/12/1982253.html
    http://www.cnblogs.com/TenosDoIt/p/3203137.html

    展开全文
  • 在重新编译新版本Qt(Qt 5.13.0)时,遇见的问题。静态编译成功并添加到Kit后,编译后的程序运行提示缺少libgcc_s_dw2-1.dll等三个dll。这个问题在新版本里有略微变化,所以记录下来。

    bug知悉

    • 在重新编译新版本Qt(Qt 5.13.0)时,遇见的问题。静态编译成功并添加到Kit后,编译后的程序运行提示缺少libgcc_s_dw2-1.dll等三个dll。这个问题在新版本里有略微变化,所以记录下来。

    环境

    • Qt 5.13.0 + MinGW 32bit
    • window 10 64bit

    问题解决

    1. 先确定静态编译库的目录,如果是从电脑其他位置或者是他人电脑上拷贝过来的,可能会出现Qt Creator提示*“Qt没有被正确安装,请运行make install”。这是因为qmake里有编译时的路径信息,并且与现在的目录信息不对应,出现这种情况,简单的办法是在E:\Qt\Qt5.13.0_MinGW_static\bin*目录下新建qt.conf文件:

    [paths]
    Prefix = …

    1. 修改E:\Qt\Qt5.13.0_MinGW_static\mkspecs\common\g+±win32.conf
    • 修改前:

    QMAKE_LFLAGS_EXCEPTIONS_ON = -mthreads
    QMAKE_LFLAGS_RELEASE = -Wl,-s
    QMAKE_LFLAGS_CONSOLE = -Wl,-subsystem,console
    QMAKE_LFLAGS_WINDOWS = -Wl,-subsystem,windows
    QMAKE_LFLAGS_DLL = -shared

    • 修改后:

    QMAKE_LFLAGS = -static //新增
    QMAKE_LFLAGS_EXCEPTIONS_ON = -mthreads
    QMAKE_LFLAGS_RELEASE = -Wl,-s
    QMAKE_LFLAGS_CONSOLE = -Wl,-subsystem,console
    QMAKE_LFLAGS_WINDOWS = -Wl,-subsystem,windows
    QMAKE_LFLAGS_DLL = -static //修改

    (之前版本是修改的E:\Qt\Qt5.13.0_MinGW_static\mkspecs\win32-g++\qmake.conf

    写在后面

    知识共享许可协议
    本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。

    展开全文
  • 就是主程序只有界面和组件,和三两句的调用代码!!核心码写在DLL内,包括复制...附件中的EXE和DLL都是用普通编译的.火绒测试没有误报,如果担心建议大家重新编译!! 经测试:XP X86;WIN7 X64;WIN10 X67;三系统下没发现BUG!!
  • 在用了Tclientdataset的单元里uses midaslib,这样就可以把midas.dll静态编译到你的程序里了,程序发布的时候就不用带midas.dll。

     在用了Tclientdataset的单元里uses   midaslib,这样就可以把midas.dll静态的编译到你的程序里了,程序发布的时候就不用带midas.dll。

    展开全文
  • vs静态编译解决找不到msvcp140.dll问题

    千次阅读 2017-11-20 20:33:43
    出现找不到msvcp140.dll问题**解决方法:将程序进行静态编译 1.使用release模式编译 2.项目属性中,“C/C++”,“代码生成”中的运行库改为“多线程(/MT)”,即进行静态编译选择应用,重新生成程序即可

    问题描述 win10中vs2015编写的程序生成release版本,拷贝到win7中运行, 出现找不到msvcp140.dll问题

    解决方法:将程序进行静态编译 1.使用release模式编译 2.项目属性中,“C/C++”,“代码生成”中的运行库改为“多线程(/MT)”,即进行静态编译 选择应用,重新生成程序即可

    展开全文
  • 就是主程序只有界面和组件,和三两句的调用代码!!核心码写在DLL内,包括复制...附件中的EXE和DLL都是用普通编译的.火绒测试没有误报,如果担心建议大家重新编译!! 经测试:XP X86;WIN7 X64;WIN10 X67;三系统下没发现BUG!!
  • 我得程序要在很多Windows XP embedded系统的电脑里面运行,但是会提示缺少mfc100.dll等很多dll文件。害的我必须要安装一遍vs2010才行,另外,其实只要在vs2010安装到VC9.0和vc10.0 runtime,强制中断安装就可以了。 ...
  • 就是主程序只有界面和组件,和三两句的调用代码!!核心码写在DLL内,包括复制...附件中的EXE和DLL都是用普通编译的.火绒测试没有误报,如果担心建议大家重新编译!!经测试:XP X86;WIN7 X64;WIN10 X67;三系统下没发现BUG!!
  • 使用了fltk库。先把fltk编译成lib文件,再在工程里面引用它。 工程里面选择了静态使用MFC以及多线程MTD。...另外在编译fltk时,选择静态使用MFC或者使用标准windows库,编译出来的lib都一样 这是怎么回事啊?谢谢!
  • exiv2静态编译

    2018-10-23 19:13:59
    exiv2静态编译,环境:vc2015,可直接供Qt或VC使用。已经过测试,免去了要添加一堆的DLL文件,直接包含进程序即可。
  • Win10X64 下 VS2017 编译的X64位 Caffe, 静态编译,MT,无任何dll,无需VS运行库,支持Python caffe.exe classification.exe compute_image_mean.exe convert_cifar_data.exe convert_imageset.exe convert_mnist_...
  • Win10X64 下 VS2017 编译的X64位 Caffe(GPU), 静态编译,MT,无任何dll,无需VS运行库,支持Python caffe.exe classification.exe compute_image_mean.exe convert_cifar_data.exe convert_imageset.exe convert_...
  • 1 区别 发布程序时,需要把用的的库文件打包到应用程序中, 使用动态编译:把dll动态编译库...使用静态编译:不再需要dll,生成的目标程序可以直接运行 缺点 生成可执行文件大; 缺乏灵活性,不能部署插件 ...
  • 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生成代码的时候有一个...
  • mingw静态编译

    2012-12-06 21:17:10
    mingw的静态编译版,不需要dll了!
  • QT静态编译程序(Mingw编译)

    千次阅读 2020-06-18 08:30:07
    1. 为什么要静态编译程序? 在默认情况下,用QtCreator编译程序时,使用的是动态编译,这就导致编译好的程序在运行时需要另外加上相应的Qt库文件,以及一大堆dll文件。如果想将生成的程序连同所需要的库一起完整地...
  • 问题:VS2010 c++编写的程序在别人的机子运行不了,缺少mfc100u.dll xxx100d.dll等的解决方法 ... 使用VS2010编译的程序在windows xp中运行时 经常会出现找不到 相关的DLL文件,我们可以使用静态编译的方法把
  • 有时候调用了第三方的dll,但是...最近由于项目需要,用VS2015+opencv2.4.13编程实现了静态编译生成自己的dll,这个dll相当于将opencv的部分功能封装到自己的dll中了(不要跟我说opencv开源,不需要封装到自己的d...
  • VS2010工程静态编译

    千次阅读 2013-09-25 17:46:12
    编译过程分为静态编译和动态编译两种。  动态编译的可执行文件需要附带一个的动态链接库,在执行时,需要调用其对应动态链接库中的命令。所以其优点一方面是缩小了执行文件本身的体积,另一方面是加快了编译速度,...
  • VS2015静态编译Qt5

    千次阅读 2019-06-10 17:17:16
    超级详细的 Qt 静态编译教程......
  • (此处下载的压缩包为百度云分享网址)此版本为Qt 5.5.0官方源码手动静态编译版本,下载后解压并在Qt Creator 5.5.0中配置qmake编译器即可使用,具体配置方法可自行百度。用此qmake编译出来的exe文件自集成了其所需...
  • qt静态编译

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

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 76,605
精华内容 30,642
关键字:

dll静态编译