2013-10-02 15 views
5
cmake 2.8 
gcc (GCC) 4.8.1 

bearbeiten ----------eine gemeinsame Bibliothek mit Statik Verknüpfung CMake mit

die statischen Bibliotheken für jede Bibliothek in whole-archive Arbeiten Verpackung mit Ausnahme der pjmedia-videodev Das Problem ist jetzt, dass wenn ich versuche, und Build bekomme ich den folgenden Fehler.

cbar_factory_init': colorbar_dev.c:(.text+0x2a0): undefined reference to pjmedia_format_init_video' 

Hallo,

Ich habe eine gemeinsame Bibliothek erstellt und ich brauche diese Bibliothek mit etwa 10 statischen Bibliotheken zu verknüpfen. Ich verlinke dann meine ausführbare Datei mit der gemeinsam genutzten Bibliothek.

Meine Frage ist, dass, wenn ich renne, es nicht verbindet, wie es auch die statischen Bibliotheken will. Der Zweck besteht darin, einen Wrapper für die statischen Bibliotheken zu erstellen. Die ausführbare Datei muss also nur mit einer einzelnen gemeinsamen Bibliothek verknüpft sein. Da ich die shared library mit der Statik verknüpfe, wird die Statik automatisch Teil des Quellcodes der shared library.

Nur Code sippnets, um es kurz zu machen. In meinem CMakeLists.txt, die die gemeinsame Bibliothek und verbindet die statischen Bibliotheken erstellt:

add_library(app_module_sip SHARED app_module_sip_init.c) 

set(PJSIP_LIBRARIES 
    g7221codec 
    gsmcodec 
    ilbccodec 
    milenage 
    pj 
    pjlib-util 
    pjmedia 
    pjmedia-codec 
    pjmedia-audiodev 
    pjmedia-videodev 
    pjnath 
    pjsip 
    pjsip-simple 
    pjsip-ua 
    pjsua 
    portaudio 
    resample 
    speex 
    srtp 
) 

target_link_libraries(app_module_sip pthread m uuid nsl rt asound crypto ssl ${PJSIP_LIBRARIES}) 

Nun meine CMakeLists.txt, der die ausführbare

add_executable(app sip_test.c) 

target_link_libraries(app app_module_sip) 

macht das richtig, was ich hier tue. Ich möchte die ausführbare Datei nicht mit den statischen Bibliotheken verknüpfen. Nur die einzelne gemeinsame Bibliothek als das ist mein Wrapper, was ich die Funktionen in aufrufen werde.

Es funktioniert Link ok, wenn ich alle Statik-Bibliotheken verknüpfen, wenn Sie die ausführbare Datei, aber das ist nicht das Ergebnis, das ich will.

Vielen Dank für Ihre Anregungen,

Antwort

1
# Location for shared library 
set(LIBRARY_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/libs) 

# Create shared library 
add_library(app_module_sip SHARED app_module_sip_init.c) 

# compile and link for 32 bit mode 
set_target_properties(app_module_sip PROPERTIES COMPILE_FLAGS "-m32" LINK_FLAGS "-m32") 

# PJSIP static libraries 
set(PJSIP_LIBRARIES 
    pjsua 
    pjsip-ua 
    pjsip-simple 
    pjsip 
    pjmedia-codec 
    pjmedia-videodev 
    pjmedia 
    pjmedia-audiodev 
    pjnath 
    pjlib-util 
    resample 
    milenage 
    srtp 
    gsmcodec 
    speex 
    ilbccodec 
    g7221codec 
    portaudio 
    pj 
) 

# Wrap the static libraries in to the shared library 
target_link_libraries(app_module_sip -Wl,--start-group ${PJSIP_LIBRARIES} -Wl,--end-group 
    m uuid nsl rt pthread asound crypto ssl) 

benötigen die pjsip Bibliotheken wird der folgende Linker Befehl -Wl, wickeln - Start-Gruppe * .a -Wl, - end-Gruppe.

Das löste mein Problem.

+0

Wenn ich app_module_sip mit myapp verknüpfe, scheint CMake alle Enkelbibliotheken wie pjsua * zusätzlich zu * app_module_sip hinzuzufügen, und die doppelten Objekte vermasseln die statische Initialisierung, ganz zu schweigen von der aufgeblähten binären Größe. – nodakai

3

Ich versuchte, meine Lösung aber Ihre CMakeLists.txt für mich gearbeitet, ohne Änderungen zu testen. Noch in dieser Frage suchen: Include static lib in dynamic lib, es, dass Sie versuchen,

target_link_libraries(app_module_sip ... ssl -Wl,-whole-archive ${PJSIP_LIBRARIES} -Wl,-no_whole-archive) 

sollten erscheint (bis zum Ende scrollen, dann ist es eine lange Schlange)

+0

Das hat für mich funktioniert. Meine statische Bibliothek, die ich verlinkt habe, ist jedoch mit libpjmedia-videodev.a (colorbar_dev.o) gescheitert: In der Funktion 'cbar_factory_init ': colorbar_dev.c :(. Text + 0x2a0): undefinierter Verweis auf' pjmedia_format_init_video'. Wenn ich jedoch die statische Bibliothek pjmedia-videodev entferne, wird alles kompiliert, erstellt und ausgeführt. Nicht sicher, warum diese Bibliothek fehlgeschlagen ist. Momentan brauche ich kein Videoprogramm, aber später werde ich es brauchen. Danke für den Vorschlag. – ant2009

2

Es ist nicht so einfach.

Sie können '-Wl, - whole-archive' oder '-Wl, - export-all-symbols' verwenden, abhängig von Ihrer Plattform, aber es gibt keine gute plattformübergreifende Möglichkeit, dies zu tun. Alles funktioniert anders und Windows spielt mit lib.exe ein komplett anderes Spiel.

Sie wollen wahrscheinlich etwas tun:

http://www.mail-archive.com/[email protected]/msg01890.html

... und Unterstützung hinzufügen, die speziell für die Plattformen, die Sie unterstützen möchten, einer nach dem anderen.

+0

@ Doug, dieser Artikel war 2006 und die -all-und -nicht mehr existiert nicht mehr. Meine aktuelle ld-Version ist 'GNU ld Version 2.23.51.0.1-10.fc18' Ich denke, es wurde irgendwann entfernt. Vielen Dank. – ant2009

+0

@ ant2009 nein, ich meinte, benutze IF ("$ {CMAKE_SYSTEM}" SPIELT IRIX) ... IF (APPLE) ... IF (WIN32) ... usw. Ie. Sie müssen die verschiedenen Kompilierungsflags für jede Plattform, die Sie unterstützen möchten, manuell angeben. Es gibt keine "allgemeine" Möglichkeit, dies plattformübergreifend zu tun. – Doug

Verwandte Themen