スポンサーサイト

    上記の広告は1ヶ月以上更新のないブログに表示されています。
    新しい記事を書く事で広告が消せます。

    LNK2028 未解決のトークン

    仕事でちょっと引っかかったことがあったのでメモ.

    VC6で作成されたプログラムの機能をC#(.Net3.5)で使おうとしていたとき,VC6のライブラリに対してC++/CLIで書いたソースから静的リンクを張り,C#のソースから利用するためのラッパを書いていた(C#のコードからVCで作られた静的リンクのライブラリを直接呼べないため).

    VCライブラリ(既存品) : A.lib
    ↑静的リンク
    C++/CLIラッパライブラリ(新規) : B.dll
    ↑.Net参照
    C#のコード

    ここでB.dllをコンパイルすると「LNK2028:未解決のトークン」のエラーが発生してしまった.このエラーは,ちゃんとリンクができていない場合に発生する(場合がほぼ99%でしょう.それ以外の状況で発生したのを見たことがないので)ものなのだけど,何度設定を確認しても正しくラッパライブラリ→VCライブラリのリンクの設定は正しい.コンパイルも通るので単純な記述ミスもない.そもそも,同じライブラリ中のすべての関数に対してエラーが出ているのではなく,一部の関数だけがエラーになっている.以前同じようにラッパを書いたときには遭遇しなかったエラーで途方に暮れてしまった.

    ここでウンウン悩んでふと未解決のトークンとして表示されているシンボルに共通点があることに気づく.

    すべての関数の引数に,CString,正確にはATL::CStringTが含まれている.ここでようやくピンときた..Net以前のMFCのCStringはまさにそのものだったのだけど,.Net時代になり,unicode対応やらでブツが変わってしまっている.要は素直に書いたコードそのもののCStringが使われるのではなく,リンク時にはプロジェクトのオプションによってCStringの兄弟と入れ替わっている場合がある.

    私の状況の場合,A.libは文字セットに「マルチバイトセットを利用する」,B.dllは「Unicode文字セットを利用する」となっていて,A.libのCStringを引数にとる関数をコールしているのに,リンク時にはATL::CStringTを引数にとる関数を探していたためにブツが見つからず,エラーと相成っていた.

    B.dllの設定をA.libとあわせることで問題解決(少なくともリンクに関しては).文字コードに関しては・・・正直ちょっとこの辺の知識弱いので心配だけど,とりあえずちゃんと動いているし,ランタイムは賢い(?)ので慎重にいけば大丈夫かも.

    何時間潰したんだろうとちょっと鬱...
    スポンサーサイト

    コメントの投稿

    非公開コメント

    プロフィール

    eikun

    Author:eikun
    なかなかやるきがでない人です

    えいくんち

    twitter

    pixiv

    最新記事
    最新コメント
    最新トラックバック
    月別アーカイブ
    カテゴリ
    検索フォーム
    RSSリンクの表示
    リンク
    ブロとも申請フォーム

    この人とブロともになる

    QRコード
    QR
    上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。