[转]vs2010 静态库以及动态库编译实例

转载地址:http://blog.csdn.net/wswxfwps/article/details/31788703

有网友留言,指出了本文中有错的地方,在此谢谢指摘。

重新编辑了一下本文,新添加了一些东西以及到目前为止对静态库和动态库的心得理解和心得,和大家分享

最近在研究ffmpeg,由于用c#开发,而ffmpeg采用的是c开发,因此打算先用c将ffmpeg的一些函数封装成库,在用c#来调用,花了一天时间(确实水平太低)写了几个vs2010下的静态库以及动态库的编译实例。

一、vs2010下静态库编译

(1)、编译静态库

先建一个空的visual c++ 的win32项目,选择应用程序类型为静态库,然后传一个static.h头文件以及static.cpp的原文件,我的文件结构如下:

static.h 头文件内容如下:

[cpp] view plain copy

  1. #pragma once
  2. #include <stdio.h>
  3. #include <tchar.h>
  4. #include <io.h>
  5. #include <direct.h>
  6. extern "C" int myfun(char *Str);

static.cpp原文件内容如下:

[cpp] view plain copy

  1. #include "static.h"
  2. int  myfun(char *Str)
  3. {
  4. printf("打印内容:%s\n",Str);
  5. return 0;
  6. }

然后选择“生成解决方案”即可。

注:如果需要添加外部的头文件,则在"项目-》**项目属性-》属性配置-》c/c++-》常规-》附加包含目录"中添加;

如果需要添加其他的库文件则同样在“项目-》**项目属性-》库管理器-》常规-》附加依赖库”中添加;

(2)、如何调用

  a、调用方式一:

建立一个空的visual c++ win32空的功能,添加一个staticLibTest.cpp,然后将刚刚生成的.lib以及static.h拷贝至该工程目录下,测试代码如下:

[cpp] view plain copy

  1. #include "static.h"
  2. #pragmacomment( lib, "static.lib" ) //指定与静态库一起连接   
  3. int main(int argc, char* argv[])   
  4. {   
  5. myfun("hello world");
  6. return 0;
  7. }

以上这种调用方式成为显示调用

     b、调用方式二:

    上面有提到:

“项目-》**项目属性-》库管理器-》常规-》附加依赖库”中添加

添加对应的xxxx.lib 库即可

  

2、vs2010 动态库编译

(1)、和编译静态库很类似,建立同样一个win32的工程,在建立向导时改为动态库(dll)库编译,添加dynamic.h以及dynamic.cpp文件,文件内容如下:

dynamic.h:

[cpp] view plain copy

  1. #ifdef _WINDOWS
  2. #ifdef DLL_EXPORTS
  3. #define MYDLL_EXPORT __declspec(dllexport)
  4. #else
  5. #define MYDLL_EXPORT __declspec(dllimport)
  6. #endif
  7. #else
  8. #define MYDLL_EXPORT
  9. #endif

此定义可以放到一个头文件当中,此定义适用windows和linux

[cpp] view plain copy

  1. #pragma once
  2. extern "C"  <span style="font-family: Arial, Helvetica, sans-serif;">MYDLL_EXPORT </span><span style="font-family: Arial, Helvetica, sans-serif;"> int myfun(char * Str);</span>

在动态库的 工程属性--》配置属性---》c/c++---》预处理器---》预处理定义  当中增加

[cpp] view plain copy

  1. DLL_EXPORTS

即可。

有人也许会问,为什么

[cpp] view plain copy

  1. extern "C"

的作用是什么?

主要的还是因为c 和c++ 编译器的不同造成的。

c++ 编译器在编译出来的函数名 是返回值以及形参结合,

而c则不会,

比如: int add(int a, int b);

c:   add

c++:  类似  int_add_int_int

所以,如果我用

[cpp] view plain copy

  1. extern "C"

可以告诉编译器,这个函数用c编译器来编译,这样我们就可以显示的调用这个函数,例如用 ace_dll(ACE开源库中的一个模块)

dynamic.cpp

[cpp] view plain copy

  1. #include "dynamic.h"
  2. int myfun(char * Str)
  3. {
  4. printf("打印内容:%s\n",Str);
  5. return 0;
  6. }

(2)、如何调用

建立一个空的visual c++ win32空的功能,添加一个dynamicLibTest.cpp,然后将刚刚生成的dynamic.lib以及dynamic.dll以及dynamic.h拷贝至该工程目录下,测试代码如下:

在项目属性中添加dynamic,lib的依赖设置(方法以上有提到),测试代码如下:

[cpp] view plain copy

  1. #include"dynamic.h"
  2. int main()
  3. {
  4. myfun("hello world");
  5. return 0;
  6. }

如有问题,请留言!

时间: 2024-10-21 06:23:04

[转]vs2010 静态库以及动态库编译实例的相关文章

VS2010 编译 openssl 源代码(输出 libeay32 and ssleay32 静态库和动态库)

一.准备工作: 1.下载并安装VS 2010 开发环境. 地址:http://www.downza.cn/soft/185464.html 2.下载 ActivePerl 工具,是一个perl脚本解释器.(我们编译过程中需要执行perl脚本,所以必须安装此工具) 地址:http://downloads.activestate.com/ActivePerl/3.下载 OpenSSL 源代码,openssl 是一个安全套接字层密码库,主要包含密码算法.常用的密钥和证书封装管理功能及实现了SSL协议,

linux上静态库和动态库的编译和使用(附外部符号错误浅谈)

主要参考博客gcc创建和使用静态库和动态库 对于熟悉windows的同学,linux上的静态库.a相当于win的.lib,动态库.so相当于win的.dll. 首先简要地解释下这两种函数库的区别,参考<Linux程序设计> 1. 静态库也被称为归档文件(archive,因此创建命令是ar),编译器和链接器负责将程序代码和静态库结合在一起组成单独的可执行文件: 但是缺点是许多应用程序同时运行并使用来自同一个静态库的函数时,内存中就会有一个函数的多份副本,而且程序文件自身也有多份同样的副本,这将消

g++编译使用生成静态库和动态库(Linux)

参考文献: Linux下g++编译与使用静态库和动态库 用g++编译生成动态链接库*.so的方法及连接(多个.cc生成一个*.so) 占坑

【Linux 相关】 静态库与动态库的编译和使用

参考博客 http://www.cnblogs.com/feisky/archive/2010/03/09/1681996.html 上述博客中关于静态库与动态库的讲解,很清晰! 库的定义: 库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行.库分静态库和动态库两种. 静态库和动态库的区别 1. 静态函数库 这类库的名字一般是libxxx.a:利用静态函数库编译成的文件比较大,因为整个 函数库的所有数据都会被整合进目标代码中,他的优点就显而易见了,即编译后的执行程序不需要外部的函数

Linux编译多个不同目录下的文件以及静态库、动态库的使用

先看两篇博文,作为基础知识.如果对C/C++编译链接过程都了解的话,可以跳过不看. http://www.firedragonpzy.com.cn/index.php/archives/2556 http://www.cppblog.com/shifan3/archive/2007/01/05/17325.html 一.  编译不同目录下的多个文件 各个文件的布局如下: head.h文件的代码: [cpp] view plaincopy #ifndef  HEAD_H #define  HEAD

linux静态库和动态库编译

今天要用到静态库和动态库,于是写了几个例子来巩固一下基础.hello1.c ———————————————————— #include <stdio.h>void print1(int i) { int j; for(j=0;j<i;j++) { printf("%d * %d = %d\n",j,j,j*j); }    }hello2.c _________________________________________________ #include <

android开发 NDK 编译和使用静态库、动态库 (转)

在eclipse工程目录下建立一个jni的文件夹 在jni文件夹中建立Android.mk和Application.mk文件 Android.mk文件: Android提供的一种makefile文件,用来指定诸如编译生成so库名.引用的头文件目录.需要编译的.c/.cpp文件和.a静态库文件等.详见附件中的Android.mk. Application.mk文件: 定义了项目的一些细节,比如APP_ABI := x86(编译X86平台库).APP_PLATFORM := android-9(使用

android开发 NDK 编译和使用静态库、动态库

在eclipse工程目录下建立一个jni的文件夹. 在jni文件夹中建立Android.mk和Application.mk文件. Android.mk文件: Android提供的一种makefile文件,用来指定诸如编译生成so库名.引用的头文件目录.需要编译的.c/.cpp文件和.a静态库文件等.详见附件中的Android.mk. Application.mk文件: 定义了项目的一些细节,比如APP_ABI := x86(编译X86平台库).APP_PLATFORM := android-9(

Linux上静态库和动态库的编译和使用

linux上静态库和动态库的编译和使用(附外部符号错误浅谈) 这就是静态库和动态库的显著区别,静态库是编译期间由链接器通过include目录找到并链接到到可执行文件中,而动态库则是运行期间动态调用,只有运行时找不到对应动态库才会报错 gcc创建和使用静态库.动态库 gcc动态链接库*.so文件的生成与使用方法 原文地址:https://www.cnblogs.com/gdut-gordon/p/10390532.html