LNK2038:'boost__type_index__abi' エラー@VS2015

<現象>

  • 特定のVS2008で過去に作成したプロジェクトをVS2015へ更新したら、「LNK2038:'boost__type_index__abi' エラー」発生。
  • Boost 1.67を使用していたのでBoost 1.72へ更新したが同様のエラーで実行できず。

<原因>

  • StdAfx.h等で「#define BOOST_NO_TYPEID」を設定していたプロジェクトだったのが原因
  • VS2015へ変換したVS2008プロジェクトのうち、上記エラーが発生しないものは、上記defineを使用していない。

<対策>

  • #define BOOST_NO_TYPEID をプロジェクト内で検索&削除した後、リビルドにてエラー消滅を確認。
  • ->恐らくVS2008のときにTYPEIDを含むBoostコードのエラー回避で定義していた模様。
  • 同様に、BOOST_NO_RTTIやBOOST_TYPE_INDEX_FORCE_NO_RTTI_COMPATIBILITY を有効にしたプロジェクトでもエラーとなる(と思う)。

<参考>

  • visualc.hpp :ここでVS2010以降の場合、BOOST_HAS_PRAGMA_DETECT_MISMATCHが定義される。
  • type_index.hpp :ここでMSVCかつBOOST_NO_RTTIかつBOOST_HAS_PRAGMA_DETECT_MISMATCHのときもれなくエラー。(探していないがBOOST_NO_TYPEIDの場合、どこかでBOOST_NO_RTTIが有効になる模様)
  • VS2008はBOOST_HAS_PRAGMA_DETECT_MISMATCHが有効でないため、エラーにはならない。

<今回のトラブルから得られたこと>

  • 早い段階でtype_index.hppにたどり着いていたが、Boost側の問題と思い込んだのが敗因。
  • type_index.hppのエラー出力箇所のマクロ(BOOST_HAS_PRAGMA_DETECT_MISMATCH等)定義箇所を探すのが近道か。
  • VisualStudioの検索「ソリューション全体(外部アイテムを含む)」が超優秀なことが判ったのが収穫。ライブラリも検索できるのは超助かる。
  • 強制的にBoost1.72適応&b2 コンパイルオプション対応 が進んだので良しとしてみる。

<悩んだ時間>

  • 1日強

 

VisualStudio2008のマクロが動かない@Windows10

ようやく、メイン開発用のOSをWindows10に変更した。VisualStudioは2015/2019のペアで行こうと考えていたが、もうしばらくはVisualStudio2008も必要なためインストールを行い、簡単な動作確認も問題なかったが・・・

<現象>

  • VisualStudio2008のマクロが動かない。(マクロ実行すると砂時計が一瞬出て何も起こらない)

<原因>

  • MSのUpdate(KB2934830とか)の影響っぽい。

<試したこと>

  • vsmsvr.exe.configとdevenv.exe.configに下記1文を追加
   <AlowDComReflection enabled="true"/>
  • →結果効果なし。やっぱりマクロは動かない。当然VS2008は再起動済。

<まとめ>

  • 結局、「VisualStudio2008 SP1の更新プログラム」が効いたのかな。(VS2008SP1とは違うことに注意)

<参考リンク>

_MSC_VERの一覧(2018年版)

VisualStudio2017の導入に関して、_MSC_VERが気になったのでVS2008以降だけまとめてみた。

VisualStudio2017のC++部分はC++11/C++14/C++17対応の強化。CMake対応の追加とのこと。

VisualStudio2015のC++部分はC++11/C++14だった。

_MSC_VER _MSC_FULL_VER VC Ver. Memo
1500 150021022 VC9.0 Visual Studio 2008
1500 150030729 VC9.0 Visual Studio 2008 Update1
1600 160030319 VC10.0 Visual Studio 2010
1600 160040219 VC10.0 Visual Studio 2010 Update1
1700 170050727 VC11.0 Visual Studio 2012
1700 170051106 VC11.0 Visual Studio 2012 Update1
1700 170060315 VC11.0 Visual Studio 2012 Update2
1700 170060610 VC11.0 Visual Studio 2012 Update3
1700 170061030 VC11.0 Visual Studio 2012 Update4
1800 180021005 VC12.0 Visual Studio 2013 RTM / Update1
1800 180030501 VC12.0 Visual Studio 2013 Update2
1800 180030723 VC12.0 Visual Studio 2013 Update3
1800 180031101 VC12.0 Visual Studio 2013 Update4
1800 180040629 VC12.0 Visual Studio 2013 Update5
1900 190023026 VC14.0 Visual Studio 2015
1900 190023506 VC14.0 Visual Studio 2015 Update1
1900 190023918 VC14.0 Visual Studio 2015 Update2
1900 190024210 VC14.0 Visual Studio 2015 Update3
1910 191025017 VC14.0 Visual Studio 2017 version 15.0
1910 191025017 VC14.10 Visual Studio 2017 version 15.0-15.2
1911 191125507 VC14.11 Visual Studio 2017 version 15.3.3(Update 3)
1911 191125542 VC14.11 Visual Studio 2017 version 15.4.4(Update 4)
1911 191125547 VC14.11 Visual Studio 2017 version 15.4.5(Update 4)
1912 191225831 VC14.12 Visual Studio 2017 version 15.5.2(Update 5)
1912 191225834 VC14.12 Visual Studio 2017 version 15.5.3(Update 5)
1912 191225834 VC14.12 Visual Studio 2017 version 15.5.4(Update 5)
1912 191225835 VC14.12 Visual Studio 2017 version 15.5.6-15.5.7(Update 5)
1913 191326128 VC14.13 Visual Studio 2017 version 15.6.0-15.6.2(Update 6)
1913 191326129 VC14.13 Visual Studio 2017 version 15.6.3-15.6.4(Update 6)
1913 191326131 VC14.13 Visual Studio 2017 version 15.6.6(Update 6)
1913 191326132 VC14.13 Visual Studio 2017 version 15.6.7(Update 6)
1914 191426428 VC14.14 Visual Studio 2017 version 15.7.1(Update 7)
1914 191426429 VC14.14 Visual Studio 2017 version 15.7.2(Update 7)
1914 191426430 VC14.14 Visual Studio 2017 version 15.7.3(Update 7)
1914 191426433 VC14.14 Visual Studio 2017 version 15.7.5(Update 7)
VS2015(VC14.0),VS2017(VC14.1系)のバージョン番号の変化とかには悪意を感じる。
でもまぁ、アップデートされないよりはマシと考えることにしてみる。
<参考>

VS2008 prsht.h error RC2248: Symbol name too long

VS2008のリソースを編集しようとしたところ、発生したエラー。
**.rcファイルを直接編集し、「#include "prsht.h"」を追加ことで対処。

#define APSTUDIO_HIDDEN_SYMBOLS
#include "windows.h" 
#include "prsht.h"
#undef APSTUDIO_HIDDEN_SYMBOLS

参考リンク


MPLABX+XC32で「relocation truncated to fit: R_MIPS_GPREL16」エラー

MPLabX(v3.05)+XC32(v1.42)でPIC32MZ用のソースをビルドしたとき下記のエラーがでた。

c:/microchip/harmony/v1_11/apps/hoge/firmware/src/hoge.c:123:(.text.APP_Tasks+0x38): relocation truncated to fit: R_MIPS_GPREL16 against `hoge_hoge'
collect2.exe: error: ld returned 255 exit status

調べてみるとmips固有コンパイラオプション(-g)でエラーの様子。
<対策>
全体オプションかファイル固有のビルドオプションに「-g0」や「-g1」を付けてリビルド
  • (全体のとき)「プロジェクト」-「プロパティ」から「xc32-gcc」の「Additional options」に「-g0」等
  • (個別のとき)該当ファイル選択-「プロパティ」から「xc32-gcc」の「Additional options」に「-g0」等
<gオプションメモ>

どうやらgccのデフォルト(-g)は(-g8か-g9)相当みたい。

オプション内容
g0 デバッグ情報なし
g1 最小限のデバッグ情報
g2,g3,g4,g5,g6,g7 行番号、ソースファイル名、変数に関するデバッグ情報
g8 完全なデバッグ情報。変数は読み取り専用
g9 完全なデバッグ情報。変数の値をデバッガーで変更できる
<参考>

MicrochipHarmonyでUSB+SDCard+FS

Microchip HarmonyでUSB+SDカード処理がうまくいかなかった原因がわかったので自分メモ。旧Harmony(v1.04とか)ではSDカードドライバが未検証とかで放置していたのだが、いよいよPICでSDカードを扱いたいので試してみた。
<環境>
  • PIC32MZ2048ECG064
  • Harmony v1.11
  • XC32 v1.43
  • MHCにてUSB(MSD+CDC)+FS(FileSystem)の設定で作成したプロジェクトを使用
  • Windowsドライバ、USBデスクリプタ等はMicrochip標準を使用。
<目的>
  • PIC上のSPIモードで接続したSDカードをWindowsからも読み書きしたい
<症状>
  • Windowsからドライブ(PIC)は見えるがディスクなしとなっている
<確認など>
  • PIC内でSDの接続状態を確認(sysObj.drvSDCardのStatusを確認)すると問題なくSDカードは接続できている。
<原因>
  • system_config.h内設定のSDクライアント数不足
  • 恐らく、USBとFSで1ずつ計2のクライアントとなるため標準ではUSB側クライアントが数不足でNo Diskとなっていたと思われる。
  • Sampleの「usb/msd_sdcard」はFSを使っていないのでクライアント数1でOK。(役立たず)
  • Sampleの「usb/csc_msd_basic」はNVMサンプルなのでSD関係なし。(役立たず)
<対策>
  • MHCの「SD Card」項目で「Number of SD Card Driver Clients」 =2,「Maximum Driver Indeces」 = 2に設定
  • もしくはsystem_config.h内の下記項目を2へ変更してビルド
#define DRV_SDCARD_CLIENTS_NUMBER       2
#define DRV_SDCARD_INDEX_MAX            2
あとは簡単にデバッグできるとHarmonyも便利になるのになー。SYS_ASSERT()とか簡単に出力できるようになりますように。

AfxActivateActCtxでエラー@VS2008

VS6で作成したプロジェクトをやんごとなき理由によりVS2008へ変換したら、

 

sfxstate.cpp下記の部分で落ちた。

 

 

BOOL AFXAPI AfxActivateActCtx(HANDLE hActCtx, ULONG_PTR *lpCookie)

 

{ 

 

 BOOL rc = pfnActivateActCtx != 0 ? pfnActivateActCtx(hActCtx, lpCookie) : FALSE

 

 return rc;

 

}

 

前にも対策したことがあるけど、その都度Google先生に問い合わせるのも気がひけるので

 

対策コードを以下にメモ。
BOOL CHogeApp::InitInstance() 

 

{

 

  CWinApp::InitInstance();

 

  afxAmbientActCtx = FALSE;  //<--このフラグを追加

 

  :

 

}

 

<参考>

 

» 続きを読む

Visual Studio 2008用透過bitmap(32bit)の作成

突然、Visual Studio 2008用のRibonコントロール(CMFCRibbonCategoryとか)で使う32bit Bitmapファイルが作りたくなったので作業メモ。
  1. アルファチャンネル付きPNGファイルでツールバー元データを作成
  2. PNGto32bit BMPで32bit bitmapファイルを作成
    • https://pngtobmp32.codeplex.com/
    • <使い方>
    • PNGtoBMP32.exeを実行
    • 表示されたウィンドウにPNGファイルをDrag&Drop
    • 変換された32bitBitmapファイルは元ファイル名の拡張子違い(hoge.png→hoge.bmp)
  3. Visual Studio 2008のbitmapリソースとして登録
VisualStudio2015とかでも32bit Bitmapが直接編集できないっぽい噂は未検証。

_MSC_VERの一覧(2015年版)

VisualStudio2015の導入に関して、_MSC_VERが気になったので情報をまとめてみるとこんな感じ。

_MSC_VER _MSC_FULL_VER VC Ver. Memo
600 --- --- C/C++Compiler 6.0
700 --- --- C/C++Compiler 7.0
800 --- VC1.0 ---
900 --- VC2.0 ---
1000 --- VC4.0 ---
1010 --- VC4.1 ---
1020 --- VC4.2 ---
1100 --- VC5.0 Visual Studio 97
1200 12008804 VC6.0 Visual Studio 6.0
1300 13009466 VC7.0 Visual Studio.net 2002
1310 13102292 VC7.1 Visual Studio.net 2003
1400 140050320 VC8.0 Visual Studio 2005
1400 140050727 VC8.0 Visual Studio 2005 SP1
1500 150021022 VC9.0 Visual Studio 2008
1500 150030729 VC9.0 Visual Studio 2008 Update1
1600 160030319 VC10.0 Visual Studio 2010
1600 160040219 VC10.0 Visual Studio 2010 Update1
1700 170050727 VC11.0 Visual Studio 2012
1700 170051106 VC11.0 Visual Studio 2012 Update1
1700 170060315 VC11.0 Visual Studio 2012 Update2
1700 170060610 VC11.0 Visual Studio 2012 Update3
1700 170061030 VC11.0 Visual Studio 2012 Update4
1800 180021005 VC12.0 Visual Studio 2013 RTM / Update1
1800 180030501 VC12.0 Visual Studio 2013 Update2
1800 180030723 VC12.0 Visual Studio 2013 Update3
1800 180031101 VC12.0 Visual Studio 2013 Update4
1800 180040629 VC12.0 Visual Studio 2013 Update5
1900 190023026 VC14.0 Visual Studio 2015
1900 190023506 VC14.0 Visual Studio 2015 Update1
1900 190023918 VC14.0 Visual Studio 2015 Update2
1900 190024210 VC14.0 Visual Studio 2015 Update3
で、VC13が存在しないことに気づいたので調べてみると、「縁起が悪いから避けた」とのこと。
VC4以降であれば (VC++のバージョン + 6)×100 (例:VC7.1のとき (7.1+6)×100=1310)で計算できたのが、今後はVC12前後で処理を分けるとか考える必要があるのかー。
まぁ、決め打ちなのでわけないけどね。
<参考>

Visual Studio 2008でもOpenCV3.0.0

VS2015(VC14)でOpenCV3.0.0のライブラリができたので同じ要領でVisualStudio2008(VC9)用のOpenCV3.0.0ライブラリをビルドしたのでそのメモ。

1.OpenCV3.0.0を準備 (2015/06/04版を使用)
2.CMakeでVisualStudio2008用プロジェクト作成
3.「stdint.h」「vcruntimeh」をVisualStudio2015から移植
  • 「C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\include」から「C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\include」へコピーとか。
  • 上記2ファイルはVisualStudio2010以降から存在してるらしい。
4.cap_mjpeg_decorer.cppの下記コードを変更
std::vector<char> MotionJpegCapture::readFrame(frame_iterator it)

{

     m_file_stream.seekg(it->first);

     RiffChunk chunk;

     m_file_stream >> chunk;

     std::vector<char> result;

     result.reserve(chunk.m_size);

     result.resize(chunk.m_size);

//  m_file_stream.read(result.data(), chunk.m_size);  //オリジナルコード.C++11

     m_file_stream.read(&(result[0]), chunk.m_size);  //VC9にはdata()なんてない

     return result;

}

5.VisualStdio2008から「ALL_BUILD」を選択/ビルドすることで、サンプルexeとlibが作成されます。
<参考>

«Visual Studio 2015でOpenCV3.0.0

カレンダー

  • keisan
無料ブログはココログ
2019年11月
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30