精华内容
下载资源
问答
  • visual studio上C++库加载方式及方法:动态库静态加载、动态库动态加载、静态库加载 动态库静态加载 第一步:生成dll: 第二步:加载dll: 动态库动态加载 静态库加载 动态库静态加载 第一步:生成dll: 新建...

    visual studio上C++库加载方式及方法:动态库静态加载、动态库动态加载、静态库加载


    动态库静态加载

    第一步:生成dll:

    1. 新建vs项目
    2. 添加.h .cpp文件
    3. 设置vs项目属性
      1. 更改配置属性为动态态库,选择,项目->属性->常规->配置类型->动态库(dll)
      2. 添加编译宏,选择,“项目->属性->C/C++ ->预处理器->预处理器定义”中添加 APIEXPORT 宏
    4. 生成解决方案

    add.h文件内容

    #pragma once
    
    #ifdef APIEXPORT
    #define EXTERN_API extern "C" __declspec(dllexport)
    #else
    #define EXTERN_API extern "C" __declspec(dllimport)
    #endif
    
    EXTERN_API int add(int elm1, int elm2);
    

    add.cpp文件内容

    #include "add.h"
    
    int add(int elm1, int elm2)
    {
    	return elm1+ elm2;
    }
    

    第二步:加载dll:

    1. 新建vs项目
    2. 添加主程序入口函数.cpp文件(包含main函数的源文件)
    3. 添加第一步生成dll中的.h文件.dll文件.lib文件
      1. .h .lib可随意放置,使用时,指定正确的路径即可
      2. 放置.dll文件在和.exe文件同一目录下

    main.cpp文件内容

    //动态库静态加载
    #include <iostream>
    #include "add.h"//包含头文件
    #pragma comment(lib,"../Debug/libMathFunctions.lib")//指定.lib文件的位置
    int main()
    {
    	std::cout<<add(1, 2);
    	return 0;
    }
    

    动态库动态加载

    第一步:生成dll:

    此步骤参考动态库静态加载第一步:生成dll:

    第二步:加载dll:

    1. 新建vs项目
    2. 添加主程序入口函数.cpp文件(包含main函数的源文件)
      1. 使用Windows库函数加载dll
      2. LoadLibraryA 加载dll
      3. GetProcAddress 获取函数地址
      4. FreeLibrary 释放句柄
    3. 添加第一步生成dll中的.dll文件.lib文件
      1. .lib可随意放置,使用时,指定正确的路径即可
      2. 放置.dll文件在和.exe文件同一目录下

    main.cpp文件内容

    //动态库动态加载
    #include <iostream>
    #include <Windows.h>
    int main()
    {
    	HINSTANCE h = LoadLibraryA("libMathFunctions.dll");//第一步
    	typedef int(*FunPtr)(int a, int b);//定义函数指针
    	if (h == NULL)
    	{
    		FreeLibrary(h);
    		printf("load lib error\n");
    	}
    	else
    	{
    		FunPtr funPtr = (FunPtr)GetProcAddress(h, "add");//第二步
    		if (funPtr != NULL)
    		{
    			int result = funPtr(8, 3);
    			printf("8 + 3 =%d\n", result);
    		}
    		else
    		{
    			printf("get process error\n");
    			printf("%d", GetLastError());
    		}
    		FreeLibrary(h);//第三步
    	}
    	return 0;
    }
    

    静态库加载

    第一步:生成lib:

    1. 新建vs项目
    2. 添加.h .cpp文件
    3. 设置vs项目属性
      1. 更改配置属性为动态态库,选择,项目->属性->常规->配置类型->静态库(lib)
    4. 生成解决方案

    add.h文件

    #pragma once
    int add(int elm1, int elm2);
    

    add.cpp文件

    #include "add.h"
    int add(int elm1, int elm2)
    {
    	return elm1 + elm2;
    }
    

    第二步:加载dll:

    1. 新建vs项目
    2. 添加主程序入口函数.cpp文件(包含main函数的源文件)
    3. 添加第一步生成lib中的.lib文件.h文件
      1. .lib .h文件可随意放置,使用时,指定正确的路径即可

    main.cpp文件

    //静态库加载
    #include <iostream>
    #include "math/add.h"
    #pragma comment(lib,"../Debug/libMathFunctions.lib")
    int main()
    {
    	std::cout << add(1, 2);
    	return 0;
    }
    

    注意事项

    1. 动态库需要使用__declspec(dllexport)导出和 __declspec(dllimport)加载
    2. 静态库不需要__declspec(dllexport)和 __declspec(dllimport)

    展开全文
  • 执行 动态库静态加载-so测试 test_mysum.c //#include   // extern int sum(int a, int b);   #include #include "mysum.h" int main() {  int a,b ,c = 0;  printf("please input a and b:");  scanf...

    mysum.c

    #include <stdio.h>

    #include "mysum.h"

    int sum(int a, int b)

    {

            return (a + b);

    }

    mysum.h

    #ifndef __SRC_H__

    #define __SRC_H__

    int sum(int a, int b);

    #endi


    xushixiong@Cpl-Civil-Camera:~/data/remote_linux_C/so_example/genso$ gcc -fPIC -c mysum.c

    xushixiong@Cpl-Civil-Camera:~/data/remote_linux_C/so_example/genso$ ls -l

    总用量 12

    -rw-rw-r-- 1 xushixiong xushixiong   78 12月 17 10:21 mysum.c

    -rw-rw-r-- 1 xushixiong xushixiong   69 12月 17 10:18 mysum.h

    -rw-rw-r-- 1 xushixiong xushixiong 1232 12月 17 10:21 mysum.o

    xushixiong@Cpl-Civil-Camera:~/data/remote_linux_C/so_example/genso$ gcc -shared -o libmysum.so mysum.c

    xushixiong@Cpl-Civil-Camera:~/data/remote_linux_C/so_example/genso$ ls -l

    总用量 20

    -rwxrwxr-x 1 xushixiong xushixiong 7721 12月 17 10:22 libmysum.so

    -rw-rw-r-- 1 xushixiong xushixiong   78 12月 17 10:21 mysum.c

    -rw-rw-r-- 1 xushixiong xushixiong   69 12月 17 10:18 mysum.h

    -rw-rw-r-- 1 xushixiong xushixiong 1232 12月 17 10:21 mysum.o

    xushixiong@Cpl-Civil-Camera:~/data/remote_linux_C/so_example/genso$ rm -rf *.so

    xushixiong@Cpl-Civil-Camera:~/data/remote_linux_C/so_example/genso$ rm -rf mysum.o

    xushixiong@Cpl-Civil-Camera:~/data/remote_linux_C/so_example/genso$ ls -l

    总用量 8

    -rw-rw-r-- 1 xushixiong xushixiong 78 12月 17 10:21 mysum.c

    -rw-rw-r-- 1 xushixiong xushixiong 69 12月 17 10:18 mysum.h

    xushixiong@Cpl-Civil-Camera:~/data/remote_linux_C/so_example/genso$ gcc -fPIC -shared -o libmysum.so mysum.c

    xushixiong@Cpl-Civil-Camera:~/data/remote_linux_C/so_example/genso$ ls -l

    总用量 16

    -rwxrwxr-x 1 xushixiong xushixiong 7721 12月 17 10:23 libmysum.so

    -rw-rw-r-- 1 xushixiong xushixiong   78 12月 17 10:21 mysum.c

    -rw-rw-r-- 1 xushixiong xushixiong   69 12月 17 10:18 mysum.h


    执行 动态库静态加载-so测试

    test_mysum.c

    //#include <stdio.h > 

    // extern  int  sum(int  a, int  b);

                                       

    #include <stdio.h>

    #include "mysum.h"


    int main()

    {

            int a,b ,c = 0;

            printf("please input a and b:");

            scanf("%d %d",&a,&b);

            c= sum(a,b);

            printf("c=%d\n",c);

            return 0;

    }

    xushixiong@Cpl-Civil-Camera:~/data/remote_linux_C/so_example/genso$ gcc -o main test_mysum.c -L. -lmysum -Wall 

    xushixiong@Cpl-Civil-Camera:~/data/remote_linux_C/so_example/genso$ ls -l

    总用量 32

    -rwxrwxr-x 1 xushixiong xushixiong 7721 12月 17 10:23 libmysum.so

    -rwxrwxr-x 1 xushixiong xushixiong 8478 12月 17 10:32 main

    -rw-rw-r-- 1 xushixiong xushixiong   82 12月 17 10:32 mysum.c

    -rw-rw-r-- 1 xushixiong xushixiong   66 12月 17 10:24 mysum.h

    -rw-rw-r-- 1 xushixiong xushixiong  247 12月 17 10:32 test_mysum.c

    xushixiong@Cpl-Civil-Camera:~/data/remote_linux_C/so_example/genso$ ./main 

    ./main: error while loading shared libraries: libmysum.so: cannot open shared object file: No such file or directory

    xushixiong@Cpl-Civil-Camera:~/data/remote_linux_C/so_example/genso$ gcc -o main test_mysum.c -rdynamic -L. -lmysum -Wall 

    xushixiong@Cpl-Civil-Camera:~/data/remote_linux_C/so_example/genso$ ./main 

    ./main: error while loading shared libraries: libmysum.so: cannot open shared object file: No such file or directory

    执行 ./main时会报告错误,提示无法加载libmysum.so共享库


    处理方法有三:

     

    方法一:

     

    将动态库拷贝到

     

    /lib

     

    /usr/lib

    中去

     

    如:

    sudo cp libmysum.so /lib 

    方法二:

     

    改变环境变量:

     

    LD_LIBRARY_PATH=$PWD export LD_LIBRARY_PATH 

    方法三:

     

    在编译时指定共享库的路径:

     

    gcc -o main1 -Wl,-rpath,.-L. -louyang main.o


    xushixiong@Cpl-Civil-Camera:~/data/remote_linux_C/so_example/genso$ echo $PWD

    /workteam/xushixiong/data/remote_linux_C/so_example/genso

    xushixiong@Cpl-Civil-Camera:~/data/remote_linux_C/so_example/genso$ echo $pwd


    xushixiong@Cpl-Civil-Camera:~/data/remote_linux_C/so_example/genso$ LD_LIBRARY_PATH=$PWD

    xushixiong@Cpl-Civil-Camera:~/data/remote_linux_C/so_example/genso$ export LD_LIBRARY_PATH

    xushixiong@Cpl-Civil-Camera:~/data/remote_linux_C/so_example/genso$ echo $LD_LIBRARY_PATH

    /workteam/xushixiong/data/remote_linux_C/so_example/genso

    xushixiong@Cpl-Civil-Camera:~/data/remote_linux_C/so_example/genso$ gcc -o main test_mysum.c  -L. -lmysum -Wall 

    xushixiong@Cpl-Civil-Camera:~/data/remote_linux_C/so_example/genso$ ./main 

    please input a and b:5 5

    c=10

    xushixiong@Cpl-Civil-Camera:~/data/remote_linux_C/so_example/genso$ file main

    main: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=0x64760d09b4177ead7c1d1877bc8462fb6de03818, not stripped


    xushixiong@Cpl-Civil-Camera:~/data/remote_linux_C/so_example/genso$ gcc -o main test_mysum.c  -L. -lmysum -Wall -static

    /usr/bin/ld: cannot find -lmysum

    collect2: ld 返回 1

    xushixiong@Cpl-Civil-Camera:~/data/remote_linux_C/so_example/genso$ echo $LD_LIBRARY_PATH

    /workteam/xushixiong/data/remote_linux_C/so_example/genso

    动态库在程序运行时是需要的。

     

    可以查看程序执行时调用动态库的过程:

    xushixiong@Cpl-Civil-Camera:~/data/remote_linux_C/so_example/genso$ ls -l

    总用量 32

    -rwxrwxr-x 1 xushixiong xushixiong 7721 12月 17 11:05 libmysum.so

    -rwxrwxr-x 1 xushixiong xushixiong 8478 12月 17 11:07 main

    -rw-rw-r-- 1 xushixiong xushixiong   82 12月 17 10:32 mysum.c

    -rw-rw-r-- 1 xushixiong xushixiong   66 12月 17 10:24 mysum.h

    -rw-rw-r-- 1 xushixiong xushixiong  247 12月 17 10:32 test_mysum.c

    xushixiong@Cpl-Civil-Camera:~/data/remote_linux_C/so_example/genso$ ldd main 

            linux-vdso.so.1 =>  (0x00007fff0c513000)

            libmysum.so => /workteam/xushixiong/data/remote_linux_C/so_example/genso/libmysum.so (0x00007f3f7fdb9000)

            libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f3f7f9df000)

            /lib64/ld-linux-x86-64.so.2 (0x00007f3f7ffbd000)

    xushixiong@Cpl-Civil-Camera:~/data/remote_linux_C/so_example/genso$ ldd libmysum.so 

            linux-vdso.so.1 =>  (0x00007fff109ff000)

            libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fc03f646000)

            /lib64/ld-linux-x86-64.so.2 (0x00007fc03fc24000)



    转载于:https://my.oschina.net/u/2555236/blog/546603

    展开全文
  • 使用静态库时,我们需要...使用动态库时,我们需要别人提供的头文件,引入库和动态库,然后在自己的工程的源文件(.cpp文件)中添加头文件和#pragma comment(lib, "引入库路径") 转载于:https://www.cnblogs.com/c...

     使用静态库时,我们需要别人提供的头文件和lib文件,然后在自己的工程的源文件(.cpp文件)中添加头文件和#pragma comment(lib, "静态库的路径")

    使用动态库时,我们需要别人提供的头文件,引入库和动态库,然后在自己的工程的源文件(.cpp文件)中添加头文件和#pragma comment(lib, "引入库路径")

    转载于:https://www.cnblogs.com/chen-cai/p/9028449.html

    展开全文
  • 在VS2015中静态加载动态库时,需要将库文件(DLL)拷贝到调用程序所在的路径下,如果所需动态库较多时,就会非常麻烦。可以在项目中指定应用程序搜索动态库的路径,这样就无需再将动态库文件进行拷贝了。 可以通过两...

    VS2015中静态加载动态库时,需要将库文件(DLL)拷贝到调用程序所在的路径下,如果所需动态库较多时,就会非常麻烦。可以在项目中指定应用程序搜索动态库的路径,这样就无需再将动态库文件进行拷贝了。

    可以通过两种方法为应用程序指定搜索动态库的路径,一种是设置应用程序的“工作目录”,另外一种是设置应用程序的“环境”。

    1 设置工作目录

    使用VS2015打开调用DLL的应用程序,点击菜单栏“项目->XXX属性”,在“XXX属性”对话框的左侧选择“配置属性->调试”,在对话框右侧的“工作目录”中设置为DLL所在路径,如图1所示。

     

    1 设置项目的工作目录

    2 设置环境变量

    使用VS2015打开调用DLL的应用程序,点击菜单栏“项目->XXX属性”,在“XXX属性”对话框的左侧选择“配置属性->调试”,在对话框右侧的“环境”中输入如下代码

    path=C:\DLL;

     其中,DLLDLL文件所在的文件夹绝对路径,如图2所示。

     

    2 设置项目的环境变量

    需要注意的是,在设置了项目的“环境”变量后,需要重新启动VS2015

    展开全文
  • 现在写的通用的平台,Client/Server Side 都要求插件形式,每一个插件宿主于一个动态库中,在Symbian中... a,静态加载: b,动态加载: 动态库动态加载的几个问题: 1,在emulator上不能被load,原因有几个可能: ...
  • 动态库静态加载和动态加载This post was authored by Jeremy Martin. To learn more about Jeremy, click here. 这篇文章由杰里米·马丁 ( Jeremy Martin )发表。 要了解有关杰里米的更多信息, 请单击此处 。 One...
  • 主要介绍了linux生成(加载动态库静态库示例方法,大家参考使用
  • 静态加载动态链接 A DLL (Dynamic Link Library) acts as a shared library of functions that can be called upon by numerous applications and other DLLs. Delphi lets you create and use DLLs so that you ...
  • 软件库Library之静态库\动态库静态加载\动态加载 动态库之导入库 https://blog.csdn.net/wallaceli1981/article/details/5740718 * 动态库在开发时仅是把dll中的函数名和参数放到应用程序中,应用程序运行...
  • 动态库的动态加载和静态加载

    千次阅读 2016-07-19 09:18:21
    如果这个dll的导出函数参数有内部定义的数据类型,显然是违反低耦合性原则的,实际上这种情况下编写dll方应该提供.h、.lib和.dll文件给使用者的,即你不能以动态库的动态加载方式调用,而是以动态库静态加载方式...
  • 一、静态库 与汇编生成的目标文件一起链接为可执行文件。一个静态库可以简单看成是一组目标文件(.o/.obj...二、动态库 在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入。不同的应用程序如果调用...
  • 静态加载: 如果你有a.dll和a.lib,两个文件都有的话可以用静态加载的方式: message函数的声明你应该知道吧,把它的声明和下面的语句写到一个头文件中 #pragma comment(lib, "a.lib") ...动态调用动态库...
  • 动态库调用方式 动态加载 静态加载

    千次阅读 2009-08-18 14:37:00
    问题:我有个a.dll,我想在我的mfc对话框项目中调用a.dll中的message函数,怎样静态加载dll或者动态加载dll 并调用? 回答:静态加载:如果你有a.dll和a.lib,两个文件都有的话可以用静态加载的方式: message函数...
  • 一、动态库静态加载 1.编译动态库->链接成共享库 gcc -fpic -c math.c -o math.o //自行编写他们的头文件放在同一目录下 gcc -fpic -c show.c -o show.o gcc -shared math.o show.o -o libmath.so //libmath...
  • 首先先解释一下什么叫动态链接库的静态加载 其实静态加载的概念很简单,其实就是调用动态链接版的静态链接库lib,但是又...3.工程里必须拥有关于动态链接库的.h文件(test.h是动态库里面提供的.h文件) 好了,那...
  • 动态库静态加载  math.c #include&lt;stdio.h&gt; int add(int a,int b) { return a+b; } show.c   #include&lt;stdio.h&gt; int show(int a) { printf("两数之和...
  • 静态加载动态链接

    2013-05-03 20:57:15
    静态加载动态链接;LIB静态加载动态链接
  • inux生成(加载)动态库静态库和加载示例方法 动态库的生成: 1、/*mysum.c*/ #include #include "src.h" int sum(int a,int b) { return (a+b); } 2、/*mysum.h*/ 复制代码 代码如下: ...
  • (2)隐式加载动态链接,需要的文件:*.h(非必须文件,如果不使用*.h文件,那么调用程序所需要的函数或是类就需要自己声明,所以说建议直接使用动态链接的*.h文件。如果使用别人的动态链接没有*.h文件那只有...
  • 静态库 头文件: sumstatic.h 生成输出: sumstatic.lib  //sumstatic.h #pragma once int addInt(int a, int b); --- //sumstatic.cpp #include "stdafx.h" #include ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,981
精华内容 1,192
关键字:

动态库静态加载