2017-10-17 1 views
0

Ich versuche, eine plugin-basierte Anwendung in C++ zu erstellen.C++ Linke statische Bibliothek gegen gemeinsame Bibliothek

Ich habe zwei Ziele - Basis und Plugin.

Dies ist ein Teil meiner CMakeLists.txt, dass das Haupt funktionierts

# Executables 
# build plugin 
file (GLOB SRCP "plugin/*.?pp") 
include_directories(plugin/) 
MESSAGE (STATUS "SRC: " "${SRCP}") 
add_library(testplugin MODULE ${SRCP}) 
add_dependencies(testplugin ${DEPS_TARGETS}) 
#target_link_libraries(testplugin dlib::dlib) 
#build main 
file(GLOB SRC "*.?pp") 
message(STATUS "SRC: " "${SRC}") 
add_executable(exec ${SRC}) 
add_dependencies(exec ${DEPS_TARGETS}) 
target_link_libraries(exec dlib::dlib) 

Es baut erfolgreich, aber wenn ich versuche, das Plugin zu laden, schlägt es mit diesem Fehler

Error: Cannot load library: libtestplugin.so: undefined symbol: _ZN4dlib6loggerD1Ev

That Symbol entspricht einer Aussage im Plugin dlib::logger dlog("main.abstract_cnn");

dlib ist eine statische Bibliothek, die ich sowohl in der Basis als auch im Plugin verwende. Ich verknüpfe diese Bibliothek mit der Basisanwendung, aber ich weiß nicht, wie Link es zu einer Bibliothek/Modul? Übergibt die Basisanwendung die Symbole nicht an das Plugin? Was kann ich in dieser Situation tun?

Ich möchte auch eine Cross-Plattform-Lösung. Hauptsächlich Linux + Windows.

Kann jemand beraten? Bitte?

Wie ich lade Ich benutze eine Bibliothek namens Libsourcey, die ein Modul namens pluga zum einfachen Laden hat. Mein Programm ist das grundlegende Testprogramm, das hier gegeben wird pluga. Es funktioniert für mich, aber wenn ich versuche, eine 3rd-Party-Bibliothek einzuschließen, stecke ich fest.

Wenn jemand auf Ressourcen verweisen könnte, die erklären, wie Bibliotheken von Drittanbietern in Plugins zu verwenden, wäre es großartig!

+0

Sie verknüpfen gemeinsam genutzte Bibliotheken genau wie Sie ausführbare Programme verknüpfen. Das 'target_link_libraries', das du für die shared library auskommentiert hast, was passiert, wenn du CMake tatsächlich laufen lässt? –

+0

ich habe das versucht, aber ich bekomme diesen Fehler '/ usr/bin/ld: deps_build/dlib_build/libdlib.a (logger_kernel_1.cpp.o): Umzug R_X86_64_32 gegen '.bss' kann nicht verwendet werden, wenn ein gemeinsames Objekt gemacht wird; kompilieren mit -fPIC' – azmath

+0

Okay, das ist ein Problem. Dann müssen Sie uns mitteilen, wie Sie das "Plugin" * laden *? Bitte erstellen Sie ein [minimales, vollständiges und verifizierbares Beispiel] (http://stackoverflow.com/help/mcve) und zeigen Sie uns. –

Antwort

1

Gelöst!

Ich habe dies zu meiner cmake-Datei hinzugefügt set(CMAKE_POSITION_INDEPENDENT_CODE ON) was ist die Fehlermeldung, die versucht hat, mir zu sagen (kompilieren mit).
Ich habe das getan und jetzt bin ich in der Lage, mein Plugin gegen die statische Bibliothek zu verknüpfen.

Verwandte Themen