問題タブ [dynamic-library]
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++ - Linux で動的共有ライブラリをリンクする - 関数への未定義の参照
Linux の共有ライブラリに関連する多くの質問があることは承知していますが、Linux で単純な動的ライブラリを作成するのに苦労して 1 日を過ごすのにうんざりしているためかもしれません (Windows では 10 分もかからなかったでしょう)。この場合どうなるか。そのため、ビルド時にリンクされ、実行時に使用されるライブラリを作成しようとしています (つまり、静的ライブラリではなく、実行可能ファイルに組み込まれるライブラリではありません)。今のところ、単純な関数が含まれています。これらは私のファイルです:
1.
2.
3.
これは私が自分のプロジェクトをビルドしようとする方法です (そして、これが間違っていると思います):
これは .sh ファイルとして保存され、ターミナルでクリックして実行します。ライブラリをリンクしようとしたときに発生するエラーは次のとおりです。
そして、これが私が迷っているところです。今のところ、ライブラリを実行可能ファイルと同じフォルダーに配置したいのですが、作成方法がわからないシンボル/定義ファイルなどが必要になるかもしれません。ご協力いただきありがとうございます!
shared-libraries - 他の .dylib シンボルを (C で) 含む .dylib をビルドできますか?
何らかの目的で、他の .dylib シンボルを含む .dylib を作成しようとしています
ex : libA.dylib と libB.dylib があり、libA と libB シンボルを含む libcore.dylib を作成したい
Ao と Bo を使用して libcore.dylib を作成できることを知っています。
nm -g libcore.dylib を使用すると、AFunctions シンボルと BFunctions シンボルを見つけることができます
libA.dylib と libB.dylib を使用して libcore.dylib をビルドできるかどうか疑問に思っていました。
もちろん、コンパイルエラーはありませんが、libAとlibBのシンボルはlibcoreで参照されていません.nm -g libcore.dylibとの依存関係はシンボルがありません
それを行う方法はありますか?
ios - iOS dylib の検出 (脱獄)
または を使用して特定のパスに実際の dylib ファイルが存在するかどうかを確認する以外に、特定の動的ライブラリが iOS で利用可能かどうかをアプリ (jailbroken iOS) で確認するエレガントな方法 (Objective C または C) はありますNSFileManager
かdlopen
? (たとえば、アクセスできる利用可能な動的ライブラリに関する情報を持つオブジェクト。)
更新:プロジェクト設定(Xcode)で要件にすることもできますが、dylibが利用できない場合、フィードバックなしでアプリが起動時にクラッシュします(これをキャッチしてアラートを実行する方法がある場合)クラッシュする前に、それも許容できる解決策です)。
c - C で動的にロードされたライブラリが使用する関数を「公開」できるようにする
ユーザーがカスタム「関数」を実装して、ある種のインタープリターで実行できるようにするプログラムを C で作成しています。また、ユーザーがこれらのカスタム関数をプレーンな C で記述し、動的にロードできるようにしたいと考えています。これを行うために、インタープリター関数用とネイティブ関数用の 2 つの構造体を作成しました。
簡単な例を次に示します。
次にidentifier
、各構造体のプロパティを使用してそれらをハッシュテーブルに配置します。これを使用して、実行時にそれらを実行できます。
私の問題は、実際にはロードされたライブラリの反対側にあります。ロードされたライブラリがリストに挿入したい関数を「公開」できるようにしたいと思います。たとえば、次のような関数を使用できます。
次に、init
ライブラリから関数を呼び出すと、この関数を呼び出して関数をハッシュテーブルに挿入できます。
これは機能しますか?register_func_native
ロードされたライブラリで必要とされるため、関数がどのようにリンクされるかについて少し混乱していますが、ローダー自体で定義する必要があります。ローダー関数を別の共有ライブラリに実装して、実行時にリンクできるようにする必要がありますか?
linux - / proc / $ PID / pmapsに表示されるライブラリはどれですか?
Linuxでは、/ proc / $ PID / pmapsを調べて特定のプログラムによってロードされたライブラリを確認でき、プログラムは/ proc / self/pmapsを開いて自分自身がロードしたライブラリを確認できます。
pmapにはダイナミックライブラリのみが含まれることはわかっています。カーネルは、後でdlopenする可能性のあるライブラリを予測できないため、それらは/ proc / self/mapsに含まれないと思います。しかし、他のいくつかのシナリオがわかりません。
ビルド時にリンクされているが、まだ関数を呼び出していないライブラリは含まれていますか?私の理解では、Linuxはシンボルのリンクを最初に使用するまで遅らせるので、シンボルが表示されるかどうかはわかりません。
pmapには、再帰的に使用されるすべてのライブラリが含まれていますか?たとえば、pmapで各ライブラリを確認し、その上でlddを実行してから、それらに対してlddを実行すると、元のpmapになかった新しいライブラリが見つからないはずです。私はこれをいくつかのバイナリで試しましたが、そうであるように見えますが、運が良かったのかもしれません。
c++ - C++ での動的ライブラリ、プラグイン フレームワーク、および関数ポインターのキャスト
私は非常にオープンなプラグイン フレームワークを C++ で作成しようとしていますが、その方法を思いついたように思えますが、しつこい考えが、私がやっていることには非常に、非常に間違っていることがあると言い続けています。 、動作しないか、問題が発生します。
私のフレームワークの設計は、各プラグインのinit
関数を呼び出すカーネルで構成されています。その後、init 関数は向きを変え、カーネルのregisterPlugin
andregisterFunction
を使用して一意の ID を取得し、プラグインがその ID を使用してアクセスできるようにする各関数をそれぞれ登録します。
関数 registerPlugin は一意の ID を返します。関数 registerFunction は、次のように、その id、関数名、および汎用関数ポインターを受け取ります。
plugin_function の場所
次に、カーネルは関数ポインターを取得し、それを と を使用してマップに配置しfunction_name
ますplugin_id
。関数を登録するすべてのプラグインは、関数を type にキャストする必要がありますplugin_function
。
関数を取得するために、別のプラグインがカーネルの
次に、そのプラグインplugin_function
を元の型にキャストして、使用できるようにする必要があります。.h
プラグインが利用可能にするすべての機能の概要を説明するファイルにアクセスすることで、(理論的には) 正しい型が何であるかを認識します。プラグインは、動的ライブラリとして実装されます。
これは、異なるプラグインが相互に接続できるようにするというタスクを達成するためのスマートな方法ですか? それとも、これはクレイジーで本当にひどいプログラミング手法ですか? もしそうなら、これを達成するための正しい方法を教えてください。
編集: 説明が必要な場合は、質問してください。提供されます。
compilation - ダイナミックライブラリの使用
ダイナミックライブラリを使用するプログラムをコンパイルしたい場合、このライブラリをインストール(つまり、特定の場所、たとえば/ usr / share / libにコピー)する必要がありますか?または、このライブラリをどこかに配置し、後でリンク中にリンカーをそのライブラリにポイントした場合、たとえば「-L./thelibfolder」で問題ありませんか?
c++ - シングルトンの複製インスタンス化
Mex を介した C++ と Matlab の連携に関する大規模なプロジェクトに取り組んでおり、現在、シングルトンの 1 つに苦労しています。
クラスは前処理中にマクロを介して生成されているため、少し奇妙に見えるかもしれません。
このコードはすべて、次の行から生成されます (上記のマクロを使用)。
使い続けたい素敵なインターフェースです。
列挙型を文字列から文字列に変換する必要があるため、このクラスを列挙型の代わりとして使用したいと考えています。このクラスには、norm と none という 2 つの「列挙型」メンバーがあります。
ここでログを追加し、none_string および norm_string 関数内の挿入操作が 2 回呼び出されていることを確認しましたが、カウンターはこれを防ぐ必要があります。
私たちが試したいくつかのこと:
- 動的ライブラリを使用していますが、-rdynamic を使用しても効果がありませんでした。
- 静的変数のアドレスを出力すると、それらが異なることがはっきりとわかります。
- このクラスは動的ライブラリ内に配置されており、動的ライブラリは mex ファイルにリンクされています。この mex ファイルは、dlopen を介して別の mex ファイルによって動的にロードされています。
動的ライブラリが原因で、このクラスの複数のインスタンスが宣言され、アクティブになっている可能性があると考えていました。しかし、問題の兆候が見られない他の種類のシングルトンも使用しています。
十分に明確であったことを願っています。追加情報や説明はいつでも提供できます。
前もって感謝します!
c++ - C++: カスタム Main 関数を実装する
WinMain は、デフォルトのメイン エントリ ポイント「main」を「置き換える」関数です。
ユーザーは、次のようにメインのエントリ ポイントを定義できます。
この種のカプセル化はどのように行われますか?
おそらく、ある時点で次のようになります。
質問: WinMain を呼び出すような独自のカプセル化を行うにはどうすればよいですか? 注: 私が作成したライブラリは DLL なので、次のようになります。
ただし、問題は、DLL が関数を「認識」していないMain()
ため、「未解決の外部シンボル」コンパイル エラーがスローされることです。では、どうすればこのようにカプセル化できますか?
g++ - 実行時に共有ライブラリをロードするための LD_LIBRARY_PATH 環境変数の設定 (g++)
同じ問題に関連する 2 つの問題があります。
`pwd`/lib に保存された共有オブジェクトがあり、それを使用する実行可能ファイルは (-l および -L スイッチを使用して) 正常にコンパイルされますが、実行時に悲しみを覚えます。実行しようとすると、正常に動作
LD_LIBRARY_PATH=/my/absolute/path/to/library/directory ./test
します。しかし、LD_LIBRARY_PATH=/my/absolute/path/to/library/directory をエクスポートして実行./test
すると、共有ライブラリが見つからないと表示されます。しかし、もう一度やるとうまくいきますLD_LIBRARY_PATH=$LD_LIBRARY_PATH ./test
!! 私が間違っていることについてのアイデアはありますか?2 番目の問題は、LD_LIBRARY_PATH 環境変数のエクスポートに関連しています。ターミナルを開いて入力
export LD_LIBRARY_PATH=/path/to/stuff
してから入力echo $LD_LIBRARY_PATH
すると、変数は正しいです。ただし、export コマンドを含むスクリプトを作成した場合、単純に実行するだけでは変数は更新されません。代わりに、source install.sh
実際に変数を永続化するために実行する必要があります。これに対する最善の解決策は何ですか?
お時間をいただきありがとうございます!