0

我是 C++ 和插件开发的新手。我正在使用/为 Unix 和 Firefox 浏览器工作。所以我们开始吧:我有一个插件,它使用了自己库中的一些类。问题是:它会尽快杀死我的浏览器。MyPlugin.so 在 Firefox 的插件文件夹中时,我什至无法启动我的浏览器。该库是构建的,不会杀死使用它的桌面应用程序。我的猜测是我未能将我的库与 CMake 链接起来,或者忘记包含来自 FireBreath 的一些东西。所以这里有两件事我认为是错误的,也许有人可以帮助我。

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 吗?

最后:可能是因为您的库不在库路径中而导致崩溃。我假设你在 linux 下,这里有一些想法:LD_LIBRARY_PATH vs LIBRARY_PATHLD_LIBRARY_PATH

于 2013-06-24T20:28:57.287 回答