C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: DLLを使用する際の名前衝突の回避方法について


(過去ログ 46 を表示中)

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■24608 / inTopicNo.1)  DLLを使用する際の名前衝突の回避方法について
  
□投稿者/ ともたろう (1回)-(2008/09/04(Thu) 21:26:53)

分類:[C/C++] 

こんばんは。
DLLを使用するアプリケーションのビルド方法についてご教示ください。

Visual Studio 2005にて以下のWindowsアプリケーションを作成しています。
・EXE(自作)
 Windowsアプリケーション C++プロジェクト MFC使用
 次のDLLをインポート
・DLL(他者作)
 C++使用(MFC未使用)らしい
 ヘッダ:sample.h
 インポートライブラリ:sample.lib
 ダイナミックライブラリ:sample.dll
 の3つが提供されている。

上記環境にて#include "sample.h"してコンパイルすると
「C2371 'DBID' 再定義されています。異なる基本形です。」
というコンパイルエラーが発生しました。
sample.hを見ると、確かにDBIDという型が独自に定義されており、
さらに調べてみると、どこかで#includeされているらしい
WindowsAPI?の"oledb.h"にもDBIDが定義されていました。
(両者で定義内容は異なります)

エラーの原因は名前の衝突と思いましたので、sample.hを#includeするところを

namespace FOO
{
#include "sample.h"
}
using namespace FOO;

としてみたところ、コンパイルは正常に終了するようになりましたが、
「LNK2019 未解決のシンボル"public __thiscall FOO::CBar::CBar(void)" (??0CBar@FOO@@QAE@XY) が
関数"public void __thiscall CBaz::CBaz(void)" (?CBaz@CBaz@@QAEXXY) で参照されました。」
というリンクエラーが出るようになりました。
どうやら名前空間の"FOO"も含めた名前でエクスポート関数を捜しているようです・・・・
(一応DependencyWalkerで確認してみましたが、当然FOOという文字列はない名前でした)
プロジェクトの設定の「リンカ」−「入力」の「追加の依存ファイル」にて「sample.lib」は登録しており
libファイルは読み取っているものと考えています。

このような場合、どのように記述(設定)すれば別の型としてコンパイル、リンクができるでしょうか?

引用返信 編集キー/
■24609 / inTopicNo.2)  Re[1]: DLLを使用する際の名前衝突の回避方法について
□投稿者/ επιστημη (1310回)-(2008/09/04(Thu) 22:03:20)
επιστημη さんの Web サイト
> このような場合、どのように記述(設定)すれば別の型としてコンパイル、リンクができるでしょうか?

DLLの作者に相談するのが先決です。

引用返信 編集キー/
■24614 / inTopicNo.3)  Re[2]: DLLを使用する際の名前衝突の回避方法について
□投稿者/ ともたろう (2回)-(2008/09/05(Fri) 06:24:27)
2008/09/05(Fri) 21:50:40 編集(投稿者)

επιστημη さん、ご回答ありがとうございます。
DLLは他社(他者は変換ミスでした)のものなので
(具体的にはIBM Lotus Notes/Domino用のAPIである
"Lotus C++ API toolkit for Lotus Notes/Domino"です)
相談してもすぐに対応されるように思えませんので
効率は落ちそうですが間に自作のDLLを挟むなどして
対応しようと思います。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -