C ++ CMake undefinierte Referenz beim Verknüpfen einer ausführbaren Datei mit einer von Drittanbietern abhängigen gemeinsam genutzten Bibliothek

Ich lese viele verwandte Themen (wie1, 2, 3) aber ich habe die Antwort nicht selbst gefunden, also bin ich hier.

Ich habe ein CMake-Projekt, das erstellt und ausführbar ist, sagen wir "x". Ich habe eine gemeinsam genutzte Bibliothek mit dem Namen "a.so" erstellt, die von der anderen gemeinsam genutzten Bibliothek mit dem Namen "b.so" abhängt. Ich möchte "a" in "x" verwenden.

Hier ist meine vereinfachte "x" CMakelists.txt:

SET(ROOT_DIR ${CMAKE_CURRENT_SOURCE_DIR})

LINK_DIRECTORIES(${ROOT_DIR}/lib/a/bin/) # contains liba.so

INCLUDE_DIRECTORIES(${ROOT_DIR}/lib/a/include/) # contains "a" headers

ADD_EXECUTABLE(x ${SOURCE})

TARGET_LINK_LIBRARIES(x a)

"x" Kompilierungsausgabe-Extrakt:

Linking CXX executable ../bin/x
/usr/bin/cmake -E cmake_link_script CMakeFiles/x.dir/link.txt --verbose=1
/usr/lib64/ccache/c++   -std=c++0x    CMakeFiles/x.dir/src/main /Main.cpp.o 
 ... -L/.../lib/a/bin -rdynamic  -la  -Wl,-rpath,/.../lib/a/bin 

"a" und "b" kompilieren.

Das Problem ist, wenn ich x kompilieren möchte. Beim Verknüpfen treten Fehler auf: undefinierter Verweis auf 'Funktionsname'. Ich habe versucht, auch gegen "b" zu verlinken, aber es funktioniert immer noch nicht.

Hier "b" erscheint auch, aber ich bekomme den gleichen Fehler ...

Linking CXX executable ../bin/x
/usr/bin/cmake -E cmake_link_script CMakeFiles/x.dir/link.txt --verbose=1 
/usr/lib64/ccache/c++   -std=c++0x    CMakeFiles/x.dir/src/main 
/Main.cpp.o -o ../bin/x  -L/.../lib/b/bin -L/.../lib/a/bin 
-rdynamic -lb -la -Wl,-rpath,/.../lib/b/bin:/.../lib/a/bin 

Hier ist die Fehlerausgabe:

 $ make
 [ 20%] Automatic moc for target x
 Linking CXX executable ../bin/x
 /.../lib/b/bin/b.so: undefined reference to `snd_pcm_sw_params_set_start_threshold'
 /.../lib/b/bin/b.so: undefined reference to `snd_seq_delete_simple_port'
 /.../lib/b/bin/b.so: undefined reference to `snd_pcm_info_set_device'
 /.../lib/b/bin/b.so: undefined reference to `snd_pcm_sw_params'
 /.../lib/b/bin/b.so: undefined reference to `snd_pcm_sw_params_set_silence_threshold'
 /.../lib/b/bin/b.so: undefined reference to `snd_pcm_hw_params_any'
 /.../lib/b/bin/b.so: undefined reference to `snd_seq_drain_output'
 /.../lib/b/bin/b.so: undefined reference to `snd_ctl_pcm_next_device'

 ...

 collect2: error: ld returned 1 exit status
 CMakeFiles/x.dir/build.make:163: recipe for target '../bin/x' failed
 make[2]: *** [../bin/x] Error 1
 CMakeFiles/Makefile2:60: recipe for target 'CMakeFiles/x.dir/all' failed
 make[1]: *** [CMakeFiles/x.dir/all] Error 2
 Makefile:76: recipe for target 'all' failed
 make: *** [all] Error 2

Ich verstehe nicht, was los ist und bin jetzt verwirrt, als ich viele Dinge ausprobierte, um das Ding zum Laufen zu bringen ... aber nichts hat funktioniert.

Irgendeine Idee

Vielen Dank

Antworten auf die Frage(4)

Ihre Antwort auf die Frage