問題タブ [language-interoperability]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - C# winform での C++ ライブラリの使用
OpenTK で SPARK パーティクル システムを使用しようとしています。
私のプロジェクトにはフォルダー内のヘッダー ファイルが含まれており、他のヘッダー ファイルのみを含む 2 つのヘッダー ファイルがあり、フォルダーにはソース ファイルも含まれています。
これまでにいくつかのアプローチを試しましたが、まだ何もうまくいきませんでした。
1.P/インボーク
これは、dll をビルドした C++ プロジェクトにいくつかのコードを記述し、次にDllImport
C# で属性を使用しています (明らかに が必要using System.Runtime.InteropServices;
です)。これはクラスでは機能せず、クラス外のメソッドに対してのみ機能するという難しい方法を発見したため、このアプローチは効果がありませんでした。
2.ラッパークラス
これは、元のクラスへのポインターを含むクラスを作成しています。マネージ コードからアンマネージ コード (自動メモリ管理なし) を呼び出すと、実際には問題が発生することがわかりました。そのため、ラッパー クラスが必要であり、メソッドのシグネチャを再定義して、元のメソッドを呼び出させる必要があります。
もちろん、これには、クラスやメソッドの名前をより適切に付けるなどの利点がありますが、ライブラリが非常に大きいため、その労力がわかります。
3. 自動ラッパーの使用:
これは、特に xInterop++ を使用する場合に適したアプローチです。私はこれについて本当に楽観的で、うまくいくと思っていました。「.h ファイルと dll をください。.NET dll をビルドします」と表示されています。良いですが、そうするとエラーが発生します。簡単に言えば:
.h ファイルと dll に一貫性があり、ライブラリが C++ プロジェクトで機能することを確認する必要があります。
このエラーに対処するために、いくつかのことを試しました。
- dll に何が含まれているかを知る: グーグルやこのサイトから学んだように難しいため、失敗しました。
- ヘッダー ファイルを新しいプロジェクトに配置してビルドする: エラーを受け取り、それらを修正してからプロジェクトをビルドすると、うまくいきました。ヘッダー ファイルを含む dll ファイルを xInterop にアップロードしました。次に、見つかったクラスに通知しましたが、何も見つからなかったと述べました。私は検索して、次のステートメントを使用して必要なすべてのクラスをマークすることにより、dll によってどのクラスを公開する必要があるかをコンパイラに通知する必要があることを知りました
_declspec(dllexport)
。 - 検索と置換を使用してこの問題を修正し、再試行したところ、クラスが表示されたので、xInterop を起動して同じエラーを受け取りました。
- dll が機能することを確認するように求められました。ファイルが機能することを確認した後、プログラムを起動するとリンカー エラーが発生しました。
これが私が立ち往生している場所です。これらは私が得るリンカエラーです:
main.obj : エラー LNK2019: 未解決の外部シンボル "void __cdecl SPK::swapParticles(class SPK::Particle &,class SPK::Particle &)" (?swapParticles@SPK@@YAXAAVParticle@1@0@Z) で参照function "private: void __thiscall SPK::Pool::swapElements(class SPK::Particle &,class SPK::Particle &)" (?swapElements@?$Pool@VParticle@SPK@@@SPK@@AAEXAAVParticle@2@ 0@Z) main.obj : エラー LNK2001: 未解決の外部シンボル "unsigned int SPK::randomSeed" (?randomSeed@SPK@@3IA) main.obj : エラー LNK2001: 未解決の外部シンボル "unsigned long const SPK::NO_ID" (?NO_ID@SPK@@3KB) main.obj : エラー LNK2001: 未解決の外部シンボル "public: static float const * const SPK::Transformable::IDENTITY" (?IDENTITY@Transformable@SPK@@2QBMB)
これらのエラーを生成したコードは次のとおりです。
それが私の問題です。説明が多すぎて申し訳ありませんが、解決策が見つからないまま 3 日間検索を行いました。
PS:
ライブラリは非常に大きいため、自動ソリューションが必須です。
c++ - Fortran-C++ の相互運用性: void ポインターを介して配列を渡す
私は大まかに次のような状況にあります。Fortran コードから呼び出され、関数ポインターと void ポインターをこのような引数として取る C++ 関数があります。
これは Fortran から次のように呼び出されます
関数ポインタを介して渡したいFortran関数は次のようになります
全体CPPFunction
が正しく呼び出されているように見える場合、呼び出しFORTRANFUNCTION
て例外コードを取得します
FORTRANFUNCTION
配列データへの最初のアクセスが行われる行で正確に。
誰かが私の間違いを教えてもらえますか? また、C++ 関数は私のものではありません。変更することは不可能ではありませんが、他の多くのコードに影響を与えます。Fortan の部分は完全に私の管理下にあり、自分のやりたいことができます。
ありがとうございました。
c - unsafe.Pointer() を C 構造体にキャストするために Go 構造体を定義する必要があります
C コードと相互運用しているため、構造体を直接キャストすることができず、Go で同等のものを定義する必要がありました。からのC関数libproc.h
は
の C 構造体flavor==PROC_PIDTASKINFO
はproc_taskinfo
、で定義されているとおりですsys/proc_info.h
( に含まれていlibproc.h
ます)。
実際に Go のコードが動いたとしても、C.proc_taskinfo
直接使うことはできませんでした。Go 関数は次のとおりです。ここpropertiesOf()
に完全なソースがあります。
C 構造体を参照すると、件名に関する最新の質問と同様のエラーが報告されましたcould not determine kind of name for C.proc_taskinfo
が、今回は、定義が でインポートされていると確信しています#include
。