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