我是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_);
现在我希望这不是一个太大的文本墙,有人愿意调查并回答我。
答案 0 :(得分: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_PATH和LD_LIBRARY_PATH