VS2015下CUDA代码编译异常的一点小问题解决方法

安装了 VS2015后,下载了CUDA 8.0安装,试了一个.cu文件编译正常通过,
继续安装了一个Intel parallel_studio_xe_2016, 然后使用 Intel 的C++编译器进行编译,结果nvcc编译.cu文件时候报错,一些c++库的头文件解析不通过,
网上搜索了一下,没有找到解决方法。

自己对比了一下使用VS 的C++编译器和 Intel 的C++编译器时,在控制台输出的nvcc命令,发现 –cl-version 参数值不同

使用VS2015的C++编译器时,出现的参数是 –cl-version 2015
而使用Intel的C++编译器时,出现的参数是 –cl-version 2010

进一步查找CUDA的自定义编译配置,在 Program Files(x86)\MSBuild\Microsoft.Cpp\v4.0\v140\BuildCustomizations\ 目录下的 CUDA 8.0.props 中对编译器做了检查,

...
<CudaClVerson Condition="'$(PlatformToolset)' == 'v140'">2015</CudaClVersion>
<CudaClVersion Condition="'$(CudaClVersion)' == ''">2010</CudaClVersion>
...

CUDA的自定义编译配置中没有对Intel C++编译器做判断处理,自己修改下面那个为空时默认为2010的行,
将2010修改为2015,保存后重新编译,两个编译器都可以编译通过,问题解决。

Popularity: 1% [?]

Random Posts

编译tesseract-ocr碰到的问题以及解决方法

下载地址 https://github.com/tesseract-ocr/tesseract
首先下载了 tesseract-master 版本,
解压后运行 ./autogen.sh 提示 libtoolize: command not found

使用yum install libtool 安装缺少的命令,重新运行 ./autogen.sh, 成功生成 configure 文件,
运行 ./configure 提示需要C++11版本的编译器,不想升级系统自带的gcc版本
重新下载 https://github.com/tesseract-ocr/tesseract ,切换tag,选择 3.0.5分支,下载 tesseract-3.05.zip
unzip tesseract-3.05.zip 解压后,运行./autogen.sh生成configure文件

运行./configure 提示 leptonica not found
到 http://www.leptonica.org/download.html 下载安装包,目前最新版本为 leptonica-1.74.1.tar.gz
tar -xzvf leptonica-1.74.1.tar.gz
cd leptonica-1.74.1
./configure
./make
./make install

重新回到 tesseract-3.05目录下,
./configure
./make
./make install

安装完成
接着需要数据文件,到 https://github.com/tesseract-ocr/tessdata
按照提示,不下载master数据,切换到 tag/3.04.00 分支下下载数据文件,
下载完成后,将 eng开头的9个文件拷贝到 /usr/loca/share/tessdata目录下

Popularity: 1% [?]

Random Posts

Clion遇到Out Of Memory问题的解决方法

运行已久的Clion环境突然提示Out of Memory,跳出程序,重新打开,项目加载完成后过一会又是Out of Memory崩掉,查看系统内存,还有很多,不是系统内存不够的原因。

将运行路径下的 clion64.exe.vmoptions 内容

-Xms256m
-Xmx2000m
-XX:NewSize=128m
-XX:MaxNewSize=128m

修改为

-Xms256m
-Xmx4000m
-XX:NewSize=256m
-XX:MaxNewSize=256m

将设置的值放大一倍后,重新启动Clion,在加载项目完成后,建立索引和符号时没有再出现Out of Memory错误崩溃

Popularity: 1% [?]

Random Posts

MySQL Connector++ 使用getString获取表字段数据出错

Linux下一个使用MySQL Connector++ 1.1.0 连接MySQL数据库的程序,在连接数据库获取数据时程序崩溃,
确定数据库中存在记录值,查看Core Dump文件,发现崩溃点发生在调用 MySQL 库的 getString 方法时的那一行,

通过google搜索,发现好一些getString出错的问题,但是多数是Windows下VS编译环境不同造成的,终于发现下面一篇中有和我的问题类似

http://stackoverflow.com/questions/4822958/mysql-c-connector-getstring-doesnt-work-correctly-while-getint-works-perfe

I had a similar problem the program would give a memory exception. Here is what I did to fix it:
std::string version = result->getString( COLUMN_NAME ).c_str();

This didn't work:
sql::SQLString sString  = result->getString( COLUMN_NAME ); <<

我的不正常代码是

std::string value = result->getString( field);

按照上面的方法将代码修改为

std::string value = result->getString( field).c_str();

暂时获取同样的数据没有出错,希望后面也不要出错。
MySQL Connector++ 从版本1.1.4开始编译依赖于BOOST库

Popularity: 1% [?]

Random Posts

    libcurl请求速度慢问题解决

    一直使用libcurl请求接口数据,最近发现一个问题,post部分请求速度变慢,每次都要超过一秒,get速度没有变化,0.1秒左右获取完毕。
    对POST请求打开VERBOSE开关,看到发出请求头信息包含 Expect: 100-Continue, 网上查找对应说明,当POST数据大于1024字节时,
    有这个头信息会先等待服务端一个继续接受的应答才继续上传,如果服务端没有应答会等待1秒再继续上传后续数据,对照VERBOSE输出的信息,
    发现发出的Content-Length 大小1026字节,刚好超出1024字节,服务端没有对100-Continue做应答于是libcurl多等了1秒才发送数据。
    修改方法,让libcurl不处理Expect 头信息

    1.   /* 添加头信息 */
    2.   struct curl_slist *list = NULL;
    3.   list = curl_slist_append(list, "Expect: ");
    4.  
    5.  /* 设置头信息 */
    6.   curl_easy_setopt(curl, CURLOPT_HTTPHEADER, list);
    7.   …
    8.   curl_slist_free_all(list); /* 释放头信息 */

    添加这段代码后,再次请求,时间降到0.x秒内,速度正常

    Popularity: 2% [?]

    Random Posts

      Klocwork Insight在Mac下的eclipse插件安装使用

      搞到一套可以在mac下运行的klocwork insight,终于在不开虚拟机的情况下也可以做c/c++代码的静态检查了。
      首先安装服务端,双击运行服务端安装包的 pkg文件,安装后会自动建立 /usr/local/kw/ 符号连接,
      再安装客户端,解压客户端的zip压缩包,得到cmd安装包盒eclipse的update site。双击运行cmd客户端安装包的pkg文件进行安装。

      使用eclipse的install site将eclipse插件装好,
      修改eclipse中的 c++项目build属性
      1. 选中项目,鼠标右击,转到 Project Properties > C/C++ Build > Tool Chain Editor.
      2. 将活动配置的 Current Builder 从 CDT Internal Builder 修改为 Gnu Make Builder 并点击 Apply .
      3. 选中项目,鼠标右击,转到 Project Properties > C/C++ Build.
      4. 在Builder Settings 标签页, 取消选中 Use default build command.
      5.在 Build command 输入框中,将原先的 make 修改为

      kwinject -u -o ${ProjDirPath}/kwinject.out make
      

      注意:要将之前安装的路径添加到PATH中,否则会报kwinject命令找不到的错误
      6. 点击 OK 按钮确定修改

      首先 clean project, 然后再build project这样就创建好了klocwork的 Build specification。

      7. 选中项目,鼠标右击,转到 Project Properties – > Klocwork > Clockwork Build Settings.
      8. 选中 Use build specification file, 浏览选中刚创建的 build specification 文件 ( kwinjec.out ), 然后点击 OK.

      后面就可以使用klocwork分析C++代码中存在的问题了。

      命令行下运行

      kwadmin create-project myproject
      cd myprojectpath
      make clean
      kwinject make
      kwbuildproject --project myproject -f -o table kwinject.out
      kwadmin load myproject table
      

      在客户端分析
      首先进入到项目所在的路径(工程所在的路径下)
      1. 创建本地项目名
      kwcheck create 会在当前目录下生成一个 .kwlp .kwps 的目录,用来存放数据和配置文件的
      2. 获取构建配置文件
      kwbuildproject –project myproject -f -o table kwinject.out

      用命令分析并查看结果
      kwcheck run –b kwinject.out

      这时缺陷是不能在 web 中查看的但可以导出 txt 和 xml 格式的文件,命令为:
      kwcheck list -F xml > report.xml
      kwcheck list -F detailed > report.txt

      Popularity: 2% [?]

      Random Posts

        使用Insure编译代码出现Warning: unable to instrument “xxx.cpp” (4) compiling original source code

        使用Insre工具做代码的内存泄露检查,编译代码时发现提示 Warning: unable to instrument “xxx.cpp” (4) compiling original source code,没有能正常插桩, 对代码逐步分析排除问题后,发现是代码中使用了 jsoncpp 库,Insure编译时对jsoncpp的头文件没有能处理好,只要引用到了json.h的代码文件,都出现了 Warning: unable to instrument 的提示。

        逐个尝试修改jsoncpp的头文件做分析,最后发现只要修改jsoncpp的 value.h 文件,
        将 class JSON_API value 类下面

        private:
        #ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION
        # ifndef JSON_VALUE_USE_INTERNAL_MAP
            class CZString
           {
        

        的private:修改为public:变为

        public:
        #ifndef JSONCPP_DOC_EXCLUDE_IMPLEMENTATION
        # ifndef JSON_VALUE_USE_INTERNAL_MAP
            class CZString
           {
        

        后,重新使用Insure编译,正常插桩,编译通过,未再提示 warning: unable to instrument 错误。

        Popularity: 2% [?]

        Random Posts

          浅尝内存泄露检查工具Insure++在Linux_X64平台下得使用

          首先安装Insure++, 按照说明展开安装文件install后,运行.install进行安装,一路默认值下去安装成功
          使用:

          第一步

          修改profile文件,将insure的bin路径添加到PATH中

          export PATH=$PATH:~/insure/bin
          

          第二步

          重新建立终端连接,到项目目录下检查修改Makefile文件
          如果直接使用g++的,需要修改每一个g++为 insure g++
          还好我是使用的CXX=g++方式,需要insure编译时只要在执行命令的时候使用

          make CXX="insure g++"
          

          即可,不用修改文件,就可以方便切换insure++编译版本和非Insure++编译版本
          重新编译前,要先执行

          make clean

          做目录清理

          第三步

          运行编译后得程序,做内存泄露检查,呵呵一下看到一堆提示,慢慢研究提示信息含义。
          后续代码效率、覆盖等功能等待进一步研究。

          使用insure++编译过程中碰到的一个问题
          所有文件编译完成后,在最后链接阶段提示

          /usr/bin/ld: cannot find -ldl

          这个在未使用insure++编译前,是没有出现这个错误得,
          首先尝试修改 ~/insure/.psrc 文件,添加了

          insure++.static_linking on

          开关行,使用静态编译方式,结果链接时出现缺少一些inusre目录下得.a, .o文件,行不通
          继续网上搜索,发现是少了符号链接 /usr/lib64/libdl.so,添加符号链接

          ln -s /lib64/libdl.so.2 /usr/lib64/libdl.so

          重新编译连接,问题消失,可以正常编译链接。

          Popularity: 2% [?]

          Random Posts

            初试Coverity对C++代码的静态检查

            之前一直在使用一个版本的goanna做C++静态代码,前两天搞到一套Coverity,尝试安装了一下,发现Coverity检查功能还是挺强大,之前goanna未检查出得一些问题它检查出来了,比如
            if ((x & 0×80) == 1)) {
            }
            这么一个判断代码,之前的goanna就没有报出问题,这个Coverity就报出了一个无效语句的问题,一下子发现等于的判断条件写错了。
            Coverity的简单使用流程
            第一步, 使用 cov-build 捕获代码Build过程涉及到得文件

            ./cov-build --dir . make
            

            第二步, 使用 cov-analysis 对捕获的结果做代码分析(分析在cov-build步骤捕获到得相关代码文件)

            ./cov-analysis --dir .
            

            第三步, 使用 cov-format-errors 输出html格式的分析结果,方便查看出问题得代码位置做代码修订。(这一步也可以使用 cov-commit-defects 提交分析结果到中心服务器,没有安装 platform 没有做效果尝试)

            ./cov-format-errors --dir . --html-output ./html
            

            打开html目录下的 index.html 即可查看分析结果。

            Popularity: 2% [?]

            Random Posts

              Libevent库静态编译方法

              1. 首先通过configure设置关闭动态编译,打开静态编译
              ./configure –disable-shared –enable-static

              可以比较默认编译选项和做如上设置的编译后的文件大小比较,
              sample目录下,静态编译的可执行文件使用strip后,http-server 为140kb,动态库方式的为20kb左右.

              2. 在链接时要添加 -lrt 这个库,否则会提示缺少函数符号clock_gettime
              gcc testev.c -I../libevent/include/ -levent -L ../libevent/lib/ -lrt

              Popularity: 3% [?]

              Random Posts

                Next Page →