自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(655)
  • 资源 (3)
  • 收藏
  • 关注

原创 openjpeg:解决静态链接时未定义引用错误:undefined reference to `__imp_opj_xxxxxxx‘

解决办法加入OPJ_STATIC宏定义。 1. 在#include "openjpeg-2.1/openjpeg.h"之前中加入OPJ_STATIC定义,如下#ifndef OPJ_STATIC#define OPJ_STATIC#endif#include "openjpeg-2.1/openjpeg.h"2.如果你用cmake编译项目代码可以在CMakeLists.txt中加入OPJ_S

2016-01-28 11:09:12 22821 5

原创 VS2015编译openjpeg(32/64位)

上一篇博客《mingw(gcc)编译openjpeg》讲了如何用gcc编译openjpeg,但我目前只会在64位平台下生成64位目标代码,如果需要在64位平台生成32位目标代码怎么办?我还没有找到不修改CMakeList.txt的情况下在Windows 64位平台用gcc生成32位代码的办法(待研究),因为我的调试环境还是喜欢用VS2015所以我决定还是用VS2015再把openjpeg编译一遍,而

2016-01-25 16:58:27 7693 3

原创 mingw(gcc)编译openjpeg

openjpeg是C语言实现的开源jpeg2000图像格式的编码/解码器,github上有编译好的linux/windows二进制文件,目前最新的版本是2.1(https://github.com/uclouvain/openjpeg/releases/tag/version.2.1) 但官方提供的二进制文件只提供了dll,如果想要将代码静态编译到项目中需要自己下载源代码编译。下载原代码下载:ht

2016-01-25 16:00:54 4582

原创 libjpeg:读取jpeg头获取图像基本信息(jpeg_read_header)

libjpeg中的jpeg_read_header函数用于读取jpeg数据头部的基本信息,以下为jpeg_read_header的定义。/* Decompression startup: read start of JPEG datastream to see what's there */EXTERN(int) jpeg_read_header (j_decompress_ptr cinfo,

2016-01-23 17:40:26 9511 1

原创 libjpeg:实现jpeg内存解压缩塈转换色彩空间/压缩分辨率

前一篇博客《libjpeg:实现jpeg内存压缩暨error_exit错误异常处理和个性化参数设置》实现了jpeg图像的内存压缩,本文来讨论jpeg图像内存解压缩的过程先贴出完整代码,再做讲解 jpeg_mem.h/* 图像矩阵基本参数 */typedef struct _image_matrix_pram{ int32_t width;

2016-01-23 16:31:41 5713

原创 libjpeg:实现jpeg内存压缩暨error_exit错误异常处理和个性化参数设置

libjpeg-turbo是与libjpeg接口兼容的一个jpeg编/解码库,其主要的特点就是利用SIMD指令(如X86架构的MMX/SSE/SSE2,ARM架构的NEON)来加速jpeg图像的编/解码,相比被广泛使用的libjpeg,编码和解码性能提高2~4倍左右。 本文介绍的内容适用于libjpeg-turbo和libjpeg(80以上版本) 关于如何用gcc对libjpeg编译,请参考我之

2016-01-20 10:51:27 5607

原创 VS2015下解决:error LNK2019: 无法解析的外部符号 __iob_func

在使用VS2015下使用libjpeg-turbo静态库,编译时报错了: error LNK2019: 无法解析的外部符号 __iob_func,该符号在函数 output_message 中被引用根据关键字在网上找到一些文章描述了类似的错误,大都是找不到外部符号__iob,与我的情况不同,但是原理是一样的, 其实__iob_func和__iob都是用来定义stdin,stdout,stde

2016-01-16 17:15:40 49700 6

原创 cmake:让mingw(gcc)生成MSVC可用的dll(.lib)

minggw(gcc)编译出来的动态库(DLL),默认是没有MSVC连接动态库所需要的lib文件的。 关于MSVC的DLL和LIB的作用和区别,请参考这篇博文,讲得很透彻了–>《DLL和LIB的区别》那么如果VC要链接gcc生成的DLL,却没有lib文件怎么办? 对于这个问题网上都有解决的办法,这篇文章讲到一些办法,可供收藏《VC6 调用GCC的DLL》,对于没有提供lib的DLL都可以用这

2016-01-15 19:49:55 12045 11

原创 mingw(gcc)编译libjpeg-turbo

最近的工作需要读写jpeg图像,网上找了半天,发现libjpeg-turbo是个不错的选择。 ibjpeg-turbo是与libjpeg接口兼容的一个jpeg编/解码库,其主要的特点就是利用SIMD指令(如X86架构的MMX/SSE/SSE2,ARM架构的NEON)来加速jpeg图像的编/解码,相比被广泛使用libjpeg,编码和解码性能提高2~4倍左右。下面是其官网的说明: libjpeg-

2016-01-15 17:57:16 3975

原创 cmake:在各级子项目(目录)之间共享变量

项目目录结构如下图,facedetect和facefeature都要用到opencl中的include文件,1.2,2.0,2.1是不同的opencl版本的头文件,希望在cmake创建Makefile时,opencl文件夹下的CMakeLists.txt能定义类似INCLUDE_OPENCL_1_2,INCLUDE_OPENCL_2_0,INCLUDE_OPENCL_2_1,这样的变量,以保存不同版

2016-01-13 08:59:33 26526 2

原创 OpenCL ICD Loader运行测试暨解决报错:ERROR: App log and stub log differ.

上一篇博文《OpenCL Installable Client Driver (ICD) Loader编译》详细描述了如何编译OpenCL ICD Loader。OpenCL ICD Loader自带了测试程序,成功编译后可以根据源码根目录下README.txt的说明运行测试程序来验证Loader是否可以正常工作: == Running ICD Test == ICD Test can b

2016-01-11 15:54:21 2556 2

原创 OpenCL Installable Client Driver (ICD) Loader编译

ICD是什么?OpenCL Installable Client Driver (ICD) Loader是实现OpenCL应用程序与各硬件厂商提供的OpenCL驱动(platform)之间隔离的中间库。从OpenCL 1.2开始,OpenCL提供了一个ICD扩展(cl_khr_icd),它允许不同厂商的多个OpenCL驱动(platform)共存于一个主机系统,应用程序可以通过调用clIcdGetP

2016-01-11 10:38:09 5935 1

原创 java(JVM)结束时释放JNI资源(Runtime.addShutdownHook)

如下代码中cmjnidrv是一个动态库,CodeCacheManager在类加载时就自动将cmjnidrv加载进来。cmjnidrv中有多个独立的线程在运行并申请了大量的内存. release()是个native方法,用于释放cmjnidrv中的申请资源并中止cmjnidrv中的线程。 为了保证在java应用结束的时候cmjnidrv的资源能被正确释放,就必须确保release()被调用。

2016-01-05 11:20:00 2670 1

原创 cmake:动态链接库(so)中静态链接tcmalloc(gperftools2.4)暨静态链接libstdc++

将tcmalloc作为动态库使用,非常方便,网上有很多资料介绍了。tcmalloc.a也可以很方便的以静态链接的方式加入应用程序中,大概因为使用太方便,网上关于这方面的介绍都是一笔带过。真正使用的时候,还是有一些需要注意的地方。 我的项目中有一个so动态库,需要在java中通过jni调用,因为涉及频繁的内存分配操作所以这个so希望用tcmalloc管理内存池以提高系统运行效率,如果使用以动态库方式

2016-01-04 18:28:34 7192

原创 bash shell脚本安装tcmalloc,linunwind,libstdc++ so库

因为项目中使用了tcmalloc,而是用gcc 5.2.0编译的64位代码,所以项目中的so依赖libunwind,tcmalloc,以及gcc5.2.0的libstdc++.so [roo@t2]ldd /usr/local/face/lib/libcmjnidrv.so linux-vdso.so.1 => (0x00007fffa4bff000) libcmimp

2016-01-02 10:42:45 1185 1

原创 ant调用make实现Makefile编译

上一篇博文《cmake:shell(bat,sh) 脚本方式生成Makefile》中完成了cmake生成Makefile脚本的过程,也就是步骤1,本文谈谈步骤2和步骤3的实现:步骤2:为了让ant能执行make,还得用脚本实现linux sh脚本实现,build.sh:#!/bin/shexport BUILD_FOLDER="`cd "$(dirname "$0")"; pwd`.prj"##

2016-01-01 13:05:29 2209

原创 cmake 生成Makefile时指定c/c++编译器

linux下在使用cmake生成Makefile的时候,如果不指定编译器,则默认是使用系统原生的编译器, 当操作系统中安装了新的版本的编译器,两个版本编译器共存的时候,如果想使用新版本的编译,在cmake生成Makefile的时候就需要指定编译。这就是我目前遇到的情况: 我的项目代码是用C++11写的,需要支持C++11的编译,而我使用的CentOS6.5原生的编译器是gcc4.4.7(位置/u

2016-01-01 12:12:25 54949 1

原创 cmake:shell(bat,sh) 脚本方式生成Makefile

项目总体是用ant来控制编译的,但有一些用c/c++写的native的动态链接库是用cmake来生成Makefile文件编译的,为了统一用ant来控制所有代码的生成,就需要将c/c++代码也能用ant脚本编译。 总体的过程是这样的: 步骤1.为了让ant能控制c/c++代码的编译,首先就需将cmake生成Makefile的过程脚本化。 步骤2.在ant脚本中调用步骤1中的脚本来实现Makef

2016-01-01 11:46:30 4746 1

原创 linux bash shell 判断目录是否为空的函数

linux shell中判断目录是否为空#!/bin/sh##方法一 判断输出字符数统计为0is_empty_dir(){ return `ls -A $1|wc -w`}##方法二 判断输出string为空#is_empty_dir(){ #return $[ -z `ls -A $1` ]#}if is_empty_dir $1then echo " $1 is emp

2015-12-29 15:55:43 13214 9

原创 java大量数据加载时resultSetType参数的设置 TYPE_FORWARD_ONLY

这两天的工作是将一1000万条数据库记录(10GB)加载到内存中,加载到500多万条记录的时候,就报了OOM(内存不足)。解决了所有外围问题后,再运行还是这个问题无法加载全部数据。仔细研究了之前从未碰过的底层访问数据库的代码。 在创建PreparedStatement时,resultSetType参数设置的是TYPE_SCROLL_INSENSITIVE或TYPE_SCROLL_SENSITIVE

2015-12-25 18:04:16 13685 1

原创 gcc下使用tcmalloc(gperftools)2.4的注意事项

前几天在折腾将项目代码的编译问题,打算使用tcmalloc内存池来管理内存分配。无意中在pgerftools的说明文档README中看到了这段话: NOTE: When compiling with programs with gcc, that you plan to link with libtcmalloc, it’s safest to pass in the flags

2015-12-25 09:07:12 4733

原创 C++11 gcc升级到5.2.0后报错:/usr/lib64/libstdc++.so.6: version 'GLIBCXX_3.4.17' not found

我的linux操作系统为centos6.5,为了能编译C++11程序,需要对gcc编译器进行升级(centos6.5默认安装的gcc编译器是4.4.7,支持C++11需要至少4.8.1)到gcc5.2.0,参照《【Linux】CentOS6.5 gcc升级方式》对编译器进行了升级,耗时两个多小时。 等编译升级就绪,编译了C++11的代码,运行时,报错: /usr/lib64/libstdc++

2015-12-21 11:53:47 2604

原创 C++11 元编程 判断是否有std::hash<T>特例并提供hash函数通用实现

std::hash的用途std::hash是C++11提供的一元函数模板,用于向标准库提供返回数据类型T哈希值(hash value)的哈希函数(hash function)。 std::hash只是定义了一个一元操作符operator(),接受一个T类型的参数,返回一个size_t类型的哈希值, C++11为所有基本类型(basic types)都提供了特例化实现: C

2015-12-14 11:35:57 5387 1

原创 JUnit4:在测试用例中用FixMethodOrder指定测试方法的执行顺序

我们在写JUnit测试用例时,有时候需要按照定义顺序执行我们的单元测试方法,比如如在测试数据库相关的用例时候要按照测试插入、查询、删除的顺序测试。如果不按照这个顺序测试可能会出现问题,比如删除方法在前面执行,后的方法就都不能通过测试,因为数据已经被清空了。而JUnit测试时默认的顺序是随机的。所以这时就需要有办法要求JUnit在执行测试方法时按照我们指定的顺序来执行。JUnit是通过@FixMeth

2015-12-13 12:44:54 14525 11

原创 C++11 元编程(meta-programming)判断T是否有==操作符

前几天看了《C++11之美》受到一些启发,想到可以通过判断一个类型是否有指定的操作符(比如==,>=)。 基本的原理与文中的差不多,利用SFINAE原则,通过返回类型后置来推断表达式的类型,推断的过程中利用declval,它可以获取类型的右值引用,以便来调用==操作符,这个过程是在编译期完成的。 如果通过==操作符比较declval的右值引用成功了,则会继续推断逗号表达式的类型,最终推断的函数返

2015-12-09 09:43:29 1489 1

原创 C++11 JNI开发中RAII的应用(三)--JavaClassMirror

以下是我以前写的将一个C++对象转成java对象的函数toJCodeBean。static jobject toJCodeBean(JNIEnv* env, const code_bean& bean) { auto code_bean_class =jni_utilits::raii_FindClass_LocalRef("Lnet/gdface/facedbsdk/local/CodeC

2015-12-03 16:56:59 921 1

原创 C++11 JNI开发中RAII的应用(二)--JNI函数封装

在上一节《C++11 JNI开发中RAII的应用(一)》中我们已经有了一些基本的RAII封装工具,本节就简单了,就是根据需要把一些常用的JNIEnv函数封装成更方便使用的模板函数。raii_NewGlobalRefraii_NewGlobalRef函数顾名思义,就是封装JNIEnv::NewGlobalRef,将一个本地引用的jobject转为全局引用封装在raii_var中。 /* 封装JN

2015-12-03 15:41:49 1739 1

原创 C++11 在析构函数中执行lambda表达式(std::function)捕获this指针的陷阱

lambda表达式是C++11最重要也最常用的一个特性之一。lambda来源于函数式编程的概念,也是现代编程语言的一个特点。 关于lambda表达式的概念并不是本文的重点,网上可以找到无数的写得极好的文章介绍它。我想说的是善用lambda表达式,将给C++编程带来极大的便利,这是本人最近学习C++11以来真实深切的感受,但是有时候误用lambda表达式也会给编程带来极大的隐患,本文以最近的经历说明

2015-12-03 09:08:51 8925 1

原创 C++11 JNI开发中RAII的应用(一)--制作基础工具

最近项目C++底层代码写完了,开始做java与底层代码的接口部分,就涉及到JNI编程,我这是第一次写JNI代码,看了很多资料,得到一个印象:JNI开发本身不复杂,但如果操作不慎,很容易造成内存泄露参见《jni 内存泄露》,而且最容易被忽视的就是本地引用(LocalReference)造成的内存泄露。 按照oracle官方对的文档 《Java Native Interface Specificat

2015-12-02 14:27:02 1269

原创 vs2015编译tcmalloc(gperftools2.4)

TcMalloc(Thread-CachingMalloc)是google-perftools工具中的一个内存管理库,所以一般提到tcmalloc,其实就是指使用gperftools,编译tcmalloc也就是编译gperftools。 第一次使用tcmalloc,网上找了好多关于使用tcmalloc的文章,都讲到了如何安装,如何使用,对于编译都是一笔带过。。。但是是真正实战的时候,发现如果对tc

2015-12-01 12:02:28 8761

原创 C++11 你真的会用迭代器(iterator)么?

C++ STL提供了丰富的标准容器(Container)对象(vector,array,queue,list,set,unordered_map/set…),让我们可以根据需求选择不同的容器管理各种类型的数据。说到使用容器,不用迭代器(iterator)是不可能的,所有的容器对象都根据容器的特点都提供了类似但不同的iterator,用于访问容器中的数据。迭代器(iterator)循环一般来说,如果要

2015-11-22 09:35:15 10501

原创 C++11 为自定义容器实现标准的forward迭代器

当前我的一个项目是基于C++11为基础开发的,在项目中需要用到哈希表来保持数据,C++11本身已经提供了丰富的容器类型(array,list,hashmap….vector),但因为项目的特殊需要不能使用C++11现成的unordered_map容器。无奈所以我只能自己根据项目需要写了一个哈希表的模板类–HashTableAbstract–也就是自定义容器。 然后问题了,为了让这个自定义的容器也能

2015-11-21 18:29:32 4190

原创 C++11 利用const_cast和type_traits修改类成员常量的通用模板函数

对于const定义的常量,不能直接修改它的值,这是这个限定符最直接的表现。但是某种情况下我们突破const限定修改其内容,C++11中可以使用const_cast转换符是用来移除变量的const限定符。关于const_cast的用法网上可以找到很多很多,基本的原理就是通过指向常量的指针来修改常量的内容,就像下面这样:const int c = 21;//下面三行代码实现修改常量cconst in

2015-11-21 11:38:32 1623 1

原创 C++11 右值引用简化代码的例子

C++11中引入了右值引用的概念 这里不再解释什么是右值引用,用一个例子说明右值引用对代码带的一些简化效果 下面是将一个方法分为两个版本,第一个方法中newNode使用右值引用参数newNode,第二个则是左值引用的 /* 右值引用版本 */ HashNode& insertNode(HashNode&& newNode) { //do something }

2015-11-20 18:52:47 1373

原创 纯C++11标准写类topk算法(不稳定排序)类模板

topk排序是指从N个数据中找出最大/小的前K个数据,并以升/降序排列,本文讨论的topk与这个定义稍有差别(所以叫类topk算法): 从N个数据中将临时计算结果t满足阀值T(大于或小于T)的前K个数据找出,并以升/降序排列(不满足阀值的t不允许占用内存)。 比如,从今年中考成绩中挑出总成绩(总成绩是根据各科成绩加总临时计算的结果,不允许保存)大于520分的前20个学生。如果有50个大于5

2015-11-20 15:15:02 1445 1

原创 C++11:unique_ptr 自己定义类似make_shared的make_unique模板函数

C++11中的智能指针分为共享型的shared_ptr和独占型的unique_ptr,C++11提供了make_shared函数来创建shared_ptr指针,使用起来更方便,有了make_shared函数,就可以完全摆脱new操作了,可以写出完全没有new/delete的程序。 但是unique_ptr却不同,unique_ptr不像shared_ptr可以通过make_shared方法来创建智

2015-11-16 16:19:47 4036 1

原创 C++11实现模板化(通用化)RAII机制

什么是RAII?RAII(Resource Acquisition Is Initialization),也称直译为“资源获取就是初始化”,是C++语言的一种管理资源、避免泄漏的机制。 C++标准保证任何情况下,已构造的对象最终会销毁,即它的析构函数最终会被调用。 RAII 机制就是利用了C++的上述特性,在需要获取使用资源RES的时候,构造一个临时对象(T),在其构造T时获取资源,在T生命期控

2015-11-15 10:04:58 11052 2

原创 c++11单实例(singleton)初始化的几种方法(memory fence,atomic,call_once)

单实例模式(singleton)下要求一个类只能有一个实例,如何保证只创建一个实例?类的静态成员延迟初始化要求静态成员只能被初始化一次,也有类似的问题。 在单线程环境下,这事儿很好办。Singleton* Singleton::getInstance() { if (m_instance == nullptr) { m_instance = new Singleton;

2015-11-11 09:26:13 23352 7

原创 无锁编程:c++11基于atomic实现共享读写锁(写优先)

在多线程状态下,对一个对象的读写需要加锁,基于CAS指令原子语句可以实现高效的线程间协调。 以下代码实现了一个资源锁: readLock/Unlock 实现共享的读取锁,MAX_SHARE_COUNT用于限制同时读取的线程数, writeLock/Unlock 实现独占的写入锁,同时只允许一个线程写入,当写入线程执行时,所有的读取线程都被阻塞。locck/unlock语句允许嵌套,

2015-11-04 18:25:52 17032 3

原创 解决std::addressof找不到及eclipse lunna+cdt 8.6.0 支持 c++11的设置

最近在eclipse下写c++代码,当用到std::addressof时,eclipse报错,说是无法解析这个函数: 但带两个下划线前缀的同名函数std::__addressof却是可以用的,而且使用std::addressof时也能正常命令行编译,不会报错 本来打算就这么将就用吧,不想去进一步搞清楚原因了,除了那红字看着不爽,没别的影响。 但是代码在vs2010下编译时又出错了,说是找不到

2015-10-30 14:21:35 2208 1

CMake脚本在ultraedit中的语法高亮支持

资源来自CMake官网: http://www.cmake.org/Wiki/images/5/56/UltraEditWordfile.tar.gz, 但这个链接已经无法访问,从历史快照中找加,上传备份 参见使用方法参见:https://blog.csdn.net/10km/article/details/52368486

2023-06-08

erpcgen-windows-x86_64.zip

用cygwin编译的erpcgen,可以windows下直接通过IDL编译生成client/server端(C++)代码,有cygwin的童鞋也可以自行编译,很方便的。 erpc git仓位置: https://github.com/EmbeddedRPC/erpc

2020-09-17

windows下MSVC兼容的dirent.h

<dirent.h>是一个应用程序接口,主要用于文件系统的目录读取操作,主要提供了几个目录数据读取函数,<dirent.h>是unix系统下常见的接口,但windows平台的MSVC编译器并没有提供这个接口( Cygwin5 and MingW现在已经提供了dirent接口),对于跨平台的项目开发就会带来一些麻烦,如果在MSVC下编译时可能因为windows平台缺少这个接口就要为windows平台另外写一些代码。本资源是从网上找的,提供了windows下为MSVC实现的dirent.h接口实现,方便跨平台开发和移植。

2016-03-31

libb64--base64编码解码库

libb64是实现base64编码解码的开源库,还提供了C++封装,用起来挺方便

2016-03-31

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除