动态库

premake5实例教程

Deadly 提交于 2020-02-23 15:59:07
premakeExample 1 简介 本文讲解如何基于premake5创建一个典型的C++解决方案,该解决方案包含三个项目: 一个依赖GLFW动态库的动态库项目ExampleDll 一个依赖ExampleDll动态库的窗口程序APP 一个基于Catch的单元测试程序UnitTest 所有代码已上传Github, 链接 。 2 你需要准备 premake5.exe程序 一个文本编辑器 一个支持C++11的编译器,因为源代码使用了C++11特性 一个支持OpenGL 1.1的显卡 3 文件的组织结构 首先需要确定整个解决方案中源代码、三方库、二进制等文件的组织结构,本文创建的文件结构如下: premakeExample/  |–premake5.lua (premake脚本文件)  |–prj/ (生成的解决方案与各项目配置文件路径)  |–build/  | |–target/ (目标生成路径)  | |–obj/ (中间文件生成路径)  |–bin/ (最终发布的二进制文件路径)  |–3rd/ (第三方库文件路径)  | |–Catch (Catch单元测试框架头文件路径)  | |–glfw (glfw三方库相关文件路径) 4 下载所需文件 premake5.exe 下载 glfw三方库 下载 本文以64位系统为例,需下载64位二进制库,也可以下载32位

Python使用Ctypes与C/C++ DLL文件通信过程介绍及实例分析

坚强是说给别人听的谎言 提交于 2020-02-22 12:59:40
项目中可能会经常用到第三方库,主要是出于程序效率考虑和节约开发时间避免重复造轮子。无论第三方库开源与否,编程语言是否与当前项目一致,我们最终的目的是在当前编程环境中调用库中的方法并得到结果或者借助库中的模块实现某种功能。这个过程会牵涉到很多东西,本篇文章将简要的介绍一下该过程的一些问题。 1.背景 多语言混合编程可以弥补某一种编程语言在性能表现或者是功能等方面的不足。虽然所有的高级语言都会最终转换成汇编指令或者最底层的机器指令,但是语言本身之间的千差万别很难一言以蔽之,这对不同语言之间相互通信造成很大的障碍。 工作中需要用python完成一项功能,但是所有现有的python库都不满足需求。最终找到了一个开源的C++库,编译得到动态库被python调用才完成工作需求。虽然整个过程耗时不多,但是期间碰到很多的问题,而且这些问题都很有思考价值。 除了这篇博文外,后续还将有一到两篇文章通过具体的实例讲解一下跨语言调用。 2.问题思考 在进行具体的介绍之前,先来思考一下调用外部库或者自己实现库所牵涉的一些一般性的问题。这样或许实际中操作使用时会理解的更加深刻,遇到问题也能够逐项的排查。 如果用C语言写的库调用了Linux的system call,纵使C本身是跨平台的,那么该库也不可能在Window上被使用,即便我们能拿到源码。这里有两个核心问题: 是否开源 是否跨平台 如果库的实现不依赖平台

gcc常用语法

◇◆丶佛笑我妖孽 提交于 2020-02-22 04:37:15
-c:只激活预处理,编译,和汇编,也就生成obj文件 -S:只激活预处理和编译,就是指把文档编译成为汇编代码。 -E:只激活预处理,不生成文档,需要把他重定向到一个输出文档里。 -o:定制目标名称,缺省的时候gcc 编译出来的文档是a.out -ansi:关闭gnu c中和ansi c不兼容的特性,激活ansi c的专有特性。 -Dmacro:相当于C语言中的#define macro -Dmacro=defn:相当于C语言中的#define macro=defn -Umacro :相当于C语言中的#undef macro -Idir:指定头文件路径。 -llibrary:指定库 -Ldir:定制编译的时候,搜索库的路径。 -g:指示编译器,在编译的时候,产生调试信息。 -static:此选项将禁止使用动态库,所以,编译出来的东西,一般都很大。 -share:此选项将尽量使用动态库,所以生成文档比较小,但是需要系统由动态库。 -O0 -O1 -O2 -O3:编译器的优化选项的4个级别,-O0表示没有优化,-O1为缺省值,-O3优化级别最高 -Wall:会打开一些很有用的警告选项,建议编译时加此选项。 -std:指定C标准,如-std=c99使用c99标准,-std=gnu99,使用C99 再加上 GNU 的一些扩展。 下面另一篇: 原文:https://www.cnblogs

静态库与动态库的创建与使用

夙愿已清 提交于 2020-02-21 10:31:57
1. 基本概念 静态库:链接时,库与编译生成的 .o 文件一起打包到可执行文件中。 linux / windows 下扩展名分别为:.a / .lib 动态库:链接时,不会打包到可执行文件中, 执行时会动态的加载动态库。 linux / windows 下扩展名分别为:.so / .dll 区别主要体现在: 可维护性。 合入更新。合入动态库的更新,只要替换库即可。但合入静态则需要重新链接,生成新的可执行程序,全量更新。 环境依赖。若包含静态库,编译成功后不依赖环境。动态库则存在依赖关系,需要环境中存在对应的动态库。 大小 空间利用率。若依赖相同静态库,则存在多份拷贝。 可执行文件大小。静态库文件较大。 动态库可以实现进程之间的资源共享,因此也称为共享库。 2. 静态库的创建与使用 静态库本质就是一组 .o 组成的压缩文件,扩展名为 .a / .lib ar -crv libXXX.a mmmm.o nnnn.o XXX 是库名,mmmm.o nnnn.o 是要打包的目标文件。crv 参数,含义分别是 c: do not warn if the library had to be created r: replace existing or insert new file(s) into the archive v: be verbose 使用时,只需在代码中引入 头文件,链接时,

自建Nuget服务器

妖精的绣舞 提交于 2020-02-19 18:15:39
前言 【PS:原文手打,转载说明出处, 博客园 】 java有Maven,.net有Nuget,概念就不一一阐述了,自己百度。下面直接进入正题开始搭建Nuget服务器 作案工具 工具:vs2017, Nuget.exe Nuget服务器版本: Nuget 3.1.2 (笔者编写时最高版本) 建立Nuget服务器步骤 1:打开VS2017,新建Asp.Net Web 空应用程序(.net framework4.6) 2:选择工具——》Nuget包管理器——》程序包管理器控制台 3:输入 Install-Package NuGet.Server 4:Web.config中修改ApiKey的Value值,任意填写(当如果是使用Nuget Package Explorer或者nuget pull命令时需要用到改key值,笔者不用这么麻烦的,所以不做解释) 5:右键发布网站,发布至IIS(安装成功) 打包动态库 总的概括流程为 生成spec文件 使用spec文件生成nupkg文件 上传nupkg文件 使用VS Nuget 生成、编辑ackage.nuspec nuget spec 生成的目录在控制台文件夹前缀 编辑Package.nuspec文件 <?xml version="1.0"?> <package > <metadata> <id>包名(动态库名称)</id> <version

wxWidgets的安装编译、相关配置、问题分析处理

匆匆过客 提交于 2020-02-19 01:54:44
一、介绍部分 (win7 下的 GUI 效果图见 本篇文章的最后部分截图2张) wxWidgets是一个开源的跨平台的C++构架库(framework),它可以提供GUI( 图形用户界面 )和其它工具。目前的2.x版本支持所有版本的Windows、带GTK+或Motif的Unix和MacOS。相当于大家熟悉的 VC++。 参考介绍: http://www.cnblogs.com/nokiaguy/archive/2009/01/27/1381071.html http://www.baidu.com/s?wd=wxWidgets http://zh.wikipedia.org/zh/WxWidgets 二、wxWidgets的安装与编译: 二.1 基础部分 编译是少不了的操作,即使你下载的是安装包,因为这个安装包只是相当于自解压包,我们还需要将其进行编译,才能得到wxWidgets在Windows可用的库。 如果你在参考了许多编译文档或教程之后发现还是没有编译出某些库文件,如 wxbase28u_gcc_custom.dll libwxmsw28ud_gl libwxmsw28u_gl libwxmsw28u_dbgrid libwxmsw28ud_dbgrid wxbase28ud_gcc_custom.dll wxbase28u_gcc_custom.dll

升级openssl

安稳与你 提交于 2020-02-18 16:33:24
升级openssl 依赖openssl的软件,如果是静态编译openssl,那么需要重新编译软件,如果是利用openssl的so动态库,那么只需要替换一下so文件并重启软件即可 openssh也依赖openssl 参考文章 http://www.111cn.net/sys/CentOS/61326.htm http://bguncle.blog.51cto.com/3184079/1392870/ http://www.cnblogs.com/doomsword/p/3654131.html http://baike.baidu.com/link?url=-JPAJup4lhmkzO__PjR9IeyHzJ46WjSHYQQSxaQYOxnjc2DVrkzJHRV5M56vhFgiif7Ir_-9spu2mgj8VtMXMq 今天用rkhunter检测了一下服务器,检测结果报:openssl版本太低 # grep -i OpenSSL /var/log/rkhunter.log [13:43:50] Checking for string '/usr/include/openssl' [ Not found ] [13:44:11] Checking version of OpenSSL [ Warning ] [13:44:11] Warning: Application

静态库&动态库&导入库

百般思念 提交于 2020-02-10 15:39:54
我遇到的问题 先贴一个StackOverflow上的 问题 上面的问题让我知道了更多动态库的知识。 我需要使用一个声音库( irrKlang )为2d游戏提供声音,我使用的编译器是 mingw-w64 ,但是irrKlang只为windows提供了msvc的动态库,不同编译器产生的库往往不能同时调用,我在链接库时发生了问题。因为不用编译器对c++函数的命名方式不同,msvc命名尤其混乱,导致由于符号不对应无法成功链接。 c库就没有这些蛋疼的问题,由于没有重载啥的,c的函数名就是最后的符号名 我的问题不能通过自己生成导入库解决,因为没法变符号命名约定,像下面这样: 函数声明: ISoundEngine* createIrrKlangDevice(E_SOUND_OUTPUT_DRIVER driver,int options,const char*,const char*); gcc的命名方式: __imp__ZN8irrklang20createIrrKlangDeviceENS_21E_SOUND_OUTPUT_DRIVEREiPKcS2_ msvc的命名方式: ?createIrrKlangDevice@irrklang@@YAPEAVISoundEngine@1@W4E_SOUND_OUTPUT_DRIVER@1@HPEBD1@Z 我的解决思路是直接通过符号查找函数地址:

QSqlDatabase: QMYSQL driver not loaded 原因以及解决办法

狂风中的少年 提交于 2020-02-09 03:18:24
原文地址:: https://blog.csdn.net/qq2399431200/article/details/79311773 相关文章 1、qt 5.2 使用mysql数据库,提示出错QSqlDatabase: QMYSQL driver not loaded---- https://blog.csdn.net/seven_dj/article/details/25395423 2、查看本地mysql 的用户名和密码---- https://blog.csdn.net/fzy198926/article/details/79287883 背景介绍: Qt的桌面版包括如下一些驱动程序:[摘录于《C++ GUI Qt4 编程第二版》] QDB2 IBMDB2 7.1 版本以及更新的版本 QIBASE Borland InterBase QMYSQL Oracle Call Interface QODBC ODBC(包括微软公司的QSL服务器) QPSQL PostgreSQL的7.3版以及更高级的版本 QSQLITE SQLite第3版 QSQLITE SQLite第2版 QTDS Sybase自适应服务器 由于授权许可的限制,Qt的开源版本无法提供所有的驱动程序。当配置Qt时,既可以选择Qt本身就包含的SQL驱动程序,也可以以插件的方式建立驱动程序

Linux操作系统学习第二篇博客

坚强是说给别人听的谎言 提交于 2020-02-09 01:37:29
1、vim的三种模式 vim是从vi发展过来的一款文本编辑器 (1)安装vim sudo apt-get install vim (2)三种模式 1 | 命令模式 打开文件后,默认进入命令模式(打开文件命令:vi + 文件名)。 2 | 编辑模式 需要输入一些命令,切换到编辑模式。 3 | 末行模式 在末行模式下可以输入一些命令。 4 | 有关关系 < 1 > 命令模式 加冒号 进入末行模式 加w 完成保存文字 自动切换到命令模式 < 2 > 命令模式 加冒号 进入末行模式 按两下ESC键进入(或者执行一个末行命令) 命令模式 2、vi中的光标位置删除、撤销操作 (1)移动光标 1 | h : 向左移动 2 | j: 向下移动 3 | k: 向上移动 4 | l: 向右移动 5 | 数字0:移动到本行首部 6 | $: 移动到本行尾部 7 | gg: 移动到当前文件开头 8 | G:移动到当前文件尾部 9 | 行数 + G: 移动到指定的行数 (2)删除操作 1 | 删除光标后面字符: x(小写) 2 | 删除光标前面字符: X(大写) 3 | 删除光标所在光标的单词: dw ( 如果光标在此单词的中间,则删除光标后面的单词相关内容 ) 4 | 删除光标到行首的字符串: d + 数字0 5 | 删除光标到行尾的字符串: D (或者d + $) 6 | 删除光标当前行: dd 7 |