• 締切済み

CLIでのライブラリのリンク方法について

VS2003のManagedC++では簡単にすることができたネイティブなライブラリを、VS2005のC++/CLIで利用することができません。 VS2003では、ファイルのインクルード、インクルードパスの追加、ライブラリのリンク、ライブラリパスの追加を行うと正しくリンクすることができたライブラリを、同じ方法でリンクしようとすると、VS2005ではコンパイルに失敗します。 ネイティブなライブラリをリンクするので、/clr:pureモードではなく、/clrモードにすればできると思い、試してみたのですが、 error LNK1314: COFF シンボル テーブルが壊れているか、または無効です。未定義のスタティック シンボルまたはラベル シンボルです。 というエラーが起きてコンパイルすることができません。 clrモードのほかに何か設定すべき項目があるのでしょうか。

みんなの回答

  • YoxoY
  • ベストアンサー率42% (43/101)
回答No.2

すみません。 商用ライブラリの場合には通常、メーカーサポートと話をして解決する。 この質問では、購入したライブラリとは記されていなかった。 という事で、ソースが手に入るのかと思ってしまいました。 情報は小出しになさらない方がよろしいかと存じます。 私は、同じソースをバージョンの違うVisual C++でビルドして、 また、同じバージョンのVCでPlatform SDKを導入してビルドして、 バイナリ比較をしてみたことがあります。 結果はリンク日時とチェックサム以外も異なったりしました。 インクルードされる提供されているファイルでの定義番号が 違ってくるからです。 可能であるならば、同じ環境でビルドして用いるべきです。 まあ、可能であれば、です。

  • YoxoY
  • ベストアンサー率42% (43/101)
回答No.1

そのライブラリ自体をVS2005でビルドし直す必要があると思います。

qwertfk
質問者

補足

回答ありがとうございます。 本当にそうでしょうか?私もあまりライブラリに詳しくはない(だから質問しているのですが)ので、よくわかりませんが、ライブラリファイルとVisualStudioのバージョンにはあまり関係はないような気がするのですがどうでしょうか。  ちなみに、現在プログラムにリンクできなくて困っているライブラリは、IntelのMKLなのですが、VS2005でもネイティブなプログラムからはリンクができるのは確認しています。また、ライブラリ自体が商品として発売されているので、ビルドしなおすというのは不可能です。  本当にビルドしなおす必要があるというのであれば、その理由は何なのでしょうか。

関連するQ&A

  • C++/CLIでfstream(.NET 3.5)

    過去の資産にアクセスするためにC#から使うクラスライブラリをC++/CLIで作成しています。 当初は.NET Framework 4.5で作成していたのですが、Windows7でFrameworkを追加するのが面倒くさいという事で、3.5でプロジェクトを起こし直してコンパイルしました。 そうしたところ、大量のリンクエラーが発生しました。 --抜粋(下記を含め、合計18行のエラー) VCMRTD.lib(locale0_implib.obj) : error LNK2034: metadata は、COFF シンボル テーブルと整合しません: LINK : error LNK2034: metadata は、COFF シンボル テーブルと整合しません MSVCMRTD.lib(locale0_implib.obj) : error LNK2020: 未解決のトークン (0A0000A1) "extern "C" double __cdecl _hypot(double,double)" (?_hypot@@$$J0YANNN@Z) -- 調査した結果、fstream関連を定義するとこの症状が出る事がわかりました。 そこで、単純に以下のプロジェクトを作成したところ、同じ現象が発生しました。 1..NET Framework 3.5でCLRクラスライブラリのプロジェクトを作成する(ここではTESTプロジェクト) 2.作成されたテンプレートの「TEST.h」に関数を追加する -----(TEST.h) // TEST.h #pragma once #include <fstream> using namespace System; namespace TEST { public ref class Class1 { void test() { std::fstream f; } }; } ---- 3.コンパイル → リンクエラー 標準関数はいくつか使っているのですが、fstream系だけがダメなようです。 (sstreamはOKでした) これに関して、何か対策方法はないものでしょうか。 情報があればお教え下さい。 よろしくお願いいたします。 開発環境: Windows 8.1 VisualStudio 2013 Pro

  • USBカメラライブラリー ECWLIB について

    何方か、EWCLIB 2.1を実際に使われている方、教えて下さい。 サイトを色々検索すると、簡単で、30分位で画像を表示する事が出来たと書かれたサイトもありますが、私は下記のサイトの通りにやっているつもりですが、色々リンクエラーが出てコンパイル出来ません。 http://www.geocities.jp/in_subaru/ewclib/help/ewclib21_help.html 環境 VC 2008 Express + ECWLIB 2.1 OS W. XP 最初はVC 2010でコンパイルしようとしましたが、エラーが多く、リンク出来ませんでした。 2008 Expressでも最初 /clr:pure または /clr:safe と共にコンパイルされた関数に対する呼び出し規約 '__stdcall ' が無効です とのエラーが出ましたが、これは 共通ランタイムサポートを「/clr:pure」→「/clr」にすればいい。 との記事を見つけ対処出来ました。 しかし、この後もincludeファイルが見つからないとか、未解決のトークン等のエラーメッセージが出てコンパイル出来ずに居ます。 このライブラリーの説明書のサンプルのコンパイルが出来た方が居られましたら、何か気付いた事をお教え頂きたいと思います。 宜しくお願い致します。

  • (GCCコンパイラ)動的リンクを絶対パスで埋め込みたい

    Unix系のOSで 動的リンクを絶対パスで指定したいのですができますか? できる場合は、その方法を教えてください ※LD_LIBRARY_PATHを使う方法ではありません。 ※また、ソースを埋め込む静的リンクでもありません。 絶対パス(フルパス)で指定したいです 現在 gcc -Iインクルードパス -Lライブラリパス名 -lライブラリ名1 ... -o ソースコード ソースコード.cpp このように書いているので あと追加でどのように指定すると絶対パス(フルパス)で埋め込めるでしょうか? できれば、ライブラリ名1だけフルパスで埋め込みたいです。 よろしくお願いします

  • スタティックリンクライブラリで2重リンクできる?

    スタティックリンクライブラリで2重リンクをしようとすると、warning LNK4006が発生してしまいます。 メッセージ: "~で定義されています; 2 つ目以降の定義は無視されます" 例えば、 aaa.libがbbb.libとccc.libをリンクしてて、bbb.libとccc.libはそれぞれddd.libをリンクしているとします。*.libはすべてスタティックリンクライブラリで提供を考えています。   [ aaa.lib ]    |   | [bbb.lib] [ccc.lib]   |     | [ddd.lib] [ddd.lib] 調べてみると「ライブラリーを結合する時に,このエラー・メッセージが表示された場合,ライブラリーに既に存在しているシンボルを追加しようとしています。」ということで、要は"ddd.lib"が重複してリンクされているという事のようなのですが、原因ばかりで解決策が分かりません。 LNK4006の解決法が分かれば良いのですが、最終的にはこの構成で"aaa.lib"だけで提供するようなライブラリを作成したいです。実現するためにはどのようにしたら良いのでしょうか?アイデアを頂けたら助かります。また詳しい方がいらっしゃいましたらご教授お願いいたします! ※Windows2000でVisualStadio.NET2003を使用してます。

  • シンボルに@n接尾辞がついているライブラリへのリンク(Fortran)

    インテル fortran Windows版 ver.11を使用しています。 あるライブラリを使用したf90のプログラムをビルドしようとしています。 コンパイルは通っているのですが、 リンクする際にシンボルが見つからずにリンクエラーとなってしまいます。 call func(varA, varB) のソース二対して、 LNK2019: 未解決の外部シンボル_FUNCが参照されました。 というような具合です。 ライブラリの中身を見てみると(nmコマンド) _FUNC@8 のようなシンボルが定義されているのですが、 一方でインテルコンパイラは _FUNC というシンボルを検索しているので未解決となってしまっているようです。 インテルのコンパイラオプション等でこのような@nの接尾辞がついたシンボルを 正しく検索、リンクできるようにする方法はないでしょうか? (サブルーチン名に@8を含めてしまうというのも一つの手段ですが、 @が予約語であるため、サブルーチン名に使用することができません。) ご存じの方がいらっしゃいましたら、ご教授いただけば幸いです。 よろしくお願いいたします。

  • Release用にもDebug用にも使えるライブラリの作り方

    皆さんこんにちは。 MFCでスタティックライブラリをつくっています。 ライブラリのコンパイルの際に、ReleaseかDebugの いずれかを指定しますが、それぞれのモードで つくったライブラリは、それぞれのモードの実行 ファイルにしかリンクできないのでしょうか? どちらのモードの実行ファイルにもリンク可能な ライブラリをつくることは可能でしょうか? もし可能な場合、どのような手順でつくれば よいのでしょうか? どうぞよろしくお願いいたします。

  • ライブラリのリンクについて

    Visual Studio net 2003 で プログラミングを始めたばかりの初心者です。 先日 猫でもわかるwindows プログラミング(第2版)の本をつかって p415にある説明どうりに 第13章のコモンコントロールのプロジェクトにライブラリをリンクさせようとしたのですが、その第13章で必要と思われるcomctl32.libが見つかりません。このライブラリがないせいか、この章でつくったプログラムには fatal error がでてきてしまいます。 いったいcomctl32.libはどこにあるのでしょうか? 一応ライブラリのリンクの仕方もよろしければご教授ください。説明に不足があれば追加致しますのでよろしくお願いします。

  • VS2013リンクするライブラリ一覧表示方法は?

    こんばんは。 Visual Studio 2013の初心者です。基本的なことで困っております。 どうかアドバイスをお願い申し上げます。 ・質問内容 プロジェクトに登録されているリンクするライブラリ名(*.lib)を確認する(一覧表示する)方法を教えて下さい。 ・背景 とある仕事を引きつぐことになりまして、貰ったVS2013のプロジェクト(ソース)をビルドしようとしましたが「****.lib」がありません。と出て来てリンクエラーになってしまいます。 足りないライブラリを追加してまたビルドすると別の「****.lib」がありません。と出てしまいます。この繰り返しです。 しかし、その都度「***.libファイルが足りない」と言って貰うのは、ウザがられるので一括して見る方法が判りません。 プロジェクトファイルでリンクに必要な「ライブラリの一覧」を見たいのです。そして、「これだけのlibが無いので欲しい」と一括して貰いたいのです。 しかし、lib名を検索掛けても何処にリンクに必要なライブラリ一覧が記録されているファイルが見つかりませんでした。 一体何処に記録されているのでしょうか? 色々web検索したのですがどうしても見つかりません。 大変、難儀しております。 宜しくお願い申し上げます。

  • error LNK2001: 外部シンボル "_main" は未解決です

    VisualC++6.0で、新規作成→win32 Dinamic-Link Libraryでプロジェクト を作成し、dllファイルを作っています。 今までは、上手くコンパイル出来て、dllを作れていました。 友人の作ったライブラリにリンクして、ソースファイルで そのライブラリの関数を使って、コンパイルすると、 LIBC.lib(crt0.obj) : error LNK2001: 外部シンボル "_main" は未解決です。 というエラーが出て困っています。 今、プロジェクトの設定→リンク→アウトプットの エントリポイントシンボルはDllEntryPoint@12となっています。 どうしたら良いでしょうか? どなたかご教授くださると助かります。 ちなみに、ライブラリの関数をコメントにすると、コンパイル出来ます。

  • ライブラリファイルのリンク (リリースバージョン時)

    VisualC++ 2005 Express Editionでライブラリファイル(.lib)をリリースバージョンでビルトし、違うプログラム(デバックバージョン)でライブラリファイルをリンクしたとき 1>コンパイルしています... 1>main.c 1>リンクしています... 1>CheckMemory.lib(check_memory.obj) : MSIL .netmodule または /GL を伴ってコンパイルされたモジュールが見つかりました。/LTCG を使用して再開始してください。リンカのパフォーマンスを向上させるためには、コマンドラインに /LTCG を追加してください。 1>LINK : warning LNK4075: /INCREMENTAL は /LTCG の指定によって無視されます。 1>LINK : warning LNK4098: defaultlib 'MSVCRT' は他のライブラリの使用と競合しています。/NODEFAULTLIB:library を使用してください。 と出るのですが、これはどうゆうことなのでしょうか? 分かる方いらっしゃいますか?お願いします。 ちなみにライブラリファイルは簡易メモリチェックプロブラムでデバック時のみ使用したいと考えているプログラムです。 使用言語はc言語です。 文章下手ですみません^^;

専門家に質問してみよう