0

C++ とプラグイン開発は初めてです。私は Unix および Firefox ブラウザで作業しています。というわけで、私は独自のライブラリのいくつかのクラスを使用するプラグインを持っています。問題は、ブラウザがすぐに終了してしまうことです。MyPlugin.so が Firefox のプラグイン フォルダにあるとすぐに、ブラウザを起動することさえできません。ライブラリはビルドされており、それを使用するデスクトップ アプリケーションを強制終了しません。私の推測では、ライブラリを CMake にリンクするのに失敗したか、FireBreath からいくつかのものを含めるのを忘れていました。だからここに私が間違っていると思う2つのことがあります.誰かが私を助けてくれるかもしれません.

1) (間違っていますか?) Cmake とのリンク: プロジェクトのCMakeLists.txtの最後にこれらのいくつかを追加しました。パスは、ライブラリがある場所です。

    add_definitions(-L${CMAKE_CURRENT_SOURCE_DIR}/../../../lib/bin)
    add_definitions(-I${CMAKE_CURRENT_SOURCE_DIR}/../../../lib/src)
    add_definitions(-lcoala64) [name of the library]
    add_definitions(-Wl,-rpath=${CMAKE_CURRENT_SOURCE_DIR}/../../../lib/bin)
    add_definitions(-pthread -I/usr/include/gtk-2.0 -I/usr/lib/x86_64-linux-gnu/gtk-2.0/include -I/usr/include/atk-1.0 -I/usr/include/cairo -I/usr/include/gdk-pixbuf-2.0 -I/usr/include/pango-1.0 -I/usr/include/gio-unix-2.0/ -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include -I/usr/include/pixman-1 -I/usr/include/freetype2 -I/usr/include/libpng12 -I/usr/include/harfbuzz  -lgtk-x11-2.0 -lgdk-x11-2.0 -latk-1.0 -lgio-2.0 -lpangoft2-1.0 -lpangocairo-1.0 -lgdk_pixbuf-2.0 -lcairo -lpango-1.0 -lfreetype -lfontconfig -lgobject-2.0 -lglib-2.0)

そして、prepmake.sh を使用してビルド ファイルを生成しました。次に、/buid /projects/MyPlugin/CMakeFiles/MyPlugin.dir/ link.txtにフラグを手動で追加しました (より良い解決策がわからないため)。

    -L/home/username/swp/dev/lib/bin
    -I/home/username/swp/dev/lib/src
    -lcoala64 -Wl,-rpath=/home/username/swp/dev/lib/bin

その後、プラグインをビルドできました。ビルドされるので、正しくリンクしたと見なすことができます。しかし、使いたいと思ったらすぐにクラッシュが発生します。

2) ライブラリの使い方が間違っていますか? MyPluginAPI.h に次のように含めます。

    #include <string>
    #include <sstream>
    #include <boost/weak_ptr.hpp>
    #include <boost/smart_ptr.hpp>
    #include "JSAPIAuto.h"
    #include "BrowserHost.h"
    #include "X11/X11KryptoKoala.h"
    //Include from my own library:
    #include "../../../lib/src/Key.hpp"

次の行を MyPlugin.cpp に追加するとすぐに、前述のクラッシュが発生しますが、同じライブラリを使用するデスクトップ アプリケーションでは同じ行が問題なく動作します。

    Key key(password_);

これがあまりにも大きなテキストの壁ではなく、誰かが調査して私に答えてくれることを願っています.

4

1 に答える 1

1

そのように add_definitions() を使用しないでください。CMake では、ディレクティブをさまざまなカテゴリで区別できるため、必要なコマンド ラインだけにディレクティブを入れることができます。以下を使用する必要があります。

 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -pthread")
 include_directories(/usr/include/gtk-2.0  
                     /usr/include/cairo
                     etc. etc.
                    )
 add_library(the_name_of_your_target gtk-x11-2.0 gdk-x11-2.0 ETC. ETC.)
 link_directories(${CMAKE_CURRENT_SOURCE_DIR}/../../../lib/bin)

さらに、ライブラリの名前、ディレクトリ、インクルード パスを含む変数を自動的に設定するのに役立つ FindPackage 機能があります。

ほとんどの情報はここここにあります

次に: prepmake.sh とは何ですか? あなたはまったくcmakeを実行していますか?cmake-gui を使用して、make や ninja などの正規のビルド システムを 1 つ選択できますか?

最後に: ライブラリがライブラリ パスにないため、クラッシュする可能性があります。Linux を使用していると仮定します。ここにいくつかのアイデアがあります: LD_LIBRARY_PATH vs LIBRARY_PATHおよびLD_LIBRARY_PATH

于 2013-06-24T20:28:57.287 に答える