2013-06-24 1 views
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_); 

Теперь я надеюсь, что это не слишком большая стена текста и кто-то готов расследовать и ответить мне.

ответ

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 функциональных возможностей, которые могут помочь вам настройки автоматически переменным, содержащие имя вашей библиотеки, их каталогов, их включают в себя путь.

Большую часть информации можно найти here и here

Тогда: Что тогда prepmake.sh? Вы вообще работаете с cmake? Можете ли вы использовать cmake-gui, а затем выбрать одну каноническую систему сборки, например make или ninja?

Наконец: Возможно, у вас есть сбой, потому что ваша библиотека не находится в вашем пути к библиотеке. Я предполагаю, что вы находитесь под Linux, вот несколько идей: LD_LIBRARY_PATH vs LIBRARY_PATH и LD_LIBRARY_PATH

+0

, чтобы уточнить, prepmake.sh - это просто помощник, который вызывает cmake, чтобы сделать из исходной сборки; мы используем его, чтобы помочь людям, не знакомым с cmake, не стрелять себе в ногу так быстро – taxilian

+0

Да; Я начал это, прежде чем я сам был полностью знаком с cmake, и мне очень хотелось бы изменить многое, но просто не успели – taxilian

+0

Эй, спасибо за идеи. К сожалению, это совсем не помогло.Я сделал то, что вы предложили, и проверил с ldd, если мой плагин связывает мою библиотеку с правильным путем, и это произошло. Я думаю, что PluginContainer FireFox ему не нравится. – dimka