undefined reference mit shared-library mit cmake
Habe ich viel von platziert finden Sie diese Antwort, aber ich habe nicht in der Lage gewesen, irgendetwas zu finden, was zu meiner situation. Es scheint so einfach, die ist, warum das ist so frustrierend.
Baue ich ein Projekt mit CMAKE. Ich bin der Generierung zwei shared libraries. Eine beinhaltet das andere. Ich bin auch der Generierung einer ausführbaren Datei. Die ausführbare Datei ist die Verknüpfung zu der gemeinsam genutzten Bibliothek kapselt die anderen. Hier ist der relevante Teil des Codes:
################################################################################
# Make the shared libraries
################################################################################
# Standard stuff
add_library(er SHARED src/std_math.cc src/snapshot.cc)
include_directories(hdr)
target_link_libraries(er rt)
# DSP library
add_library(dsp SHARED src/dsp.cc)
include_directories(hdr)
target_link_libraries(dsp er /usr/lib/libfftw3f.so /usr/lib/libfftw3.so)
################################################################################
# Make an Executable
################################################################################
message("-- Making executable for testing --")
add_executable(er_test test/dsp_test.cc)
include_directories(hdr)
target_link_libraries(er_test dsp)
################################################################################
# What to do with make install
################################################################################
message ("-- Writting install scripts --")
# See if there is an install directory already assigned. If not, set it to the
# system default.
if (NOT DEFINED INSTALL_DIR)
set (INSTALL_DIR /usr/local/)
endif (NOT DEFINED INSTALL_DIR)
message (" -- install_dir = ${INSTALL_DIR}")
# Install the libraries and header files to the appropriate places
install (TARGETS er dsp DESTINATION ${INSTALL_DIR}/bin)
install (FILES hdr/dsp.hh hdr/snapshot.hh hdr/std_math.hh DESTINATION ${INSTALL_DIR}/include)
Hier ist die Fehlermeldung, die ich bekomme.
CMakeFiles/er_test.dir/test/dsp_test.cc.o: In function `main':
dsp_test.cc:(.text.startup+0x11e): undefined reference to `std::basic_ostream<char, std::char_traits<char> >& operator<< <int>(std::basic_ostream<char, std::char_traits<char> >&, std::vector<int, std::allocator<int> > const&)'
dsp_test.cc:(.text.startup+0x142): undefined reference to `std::basic_ostream<char, std::char_traits<char> >& operator<< <int>(std::basic_ostream<char, std::char_traits<char> >&, std::vector<int, std::allocator<int> > const&)'
dsp_test.cc:(.text.startup+0x166): undefined reference to `std::vector<int, std::allocator<int> > subvec<int>(std::vector<int, std::allocator<int> > const&, int, int, int)'
dsp_test.cc:(.text.startup+0x182): undefined reference to `std::basic_ostream<char, std::char_traits<char> >& operator<< <int>(std::basic_ostream<char, std::char_traits<char> >&, std::vector<int, std::allocator<int> > const&)'
dsp_test.cc:(.text.startup+0x1b6): undefined reference to `std::vector<int, std::allocator<int> > subvec<int>(std::vector<int, std::allocator<int> > const&, int, int, int)'
und es gibt viele mehr, in denen diese kamen aus. Ich habe versucht, mit statischen Bibliotheken, aber dann ist es eben Verzögerungen das problem bis zum nächsten ausführbaren versuche ich auch auf diese Bibliotheken zu. Ich habe auch versucht mit g++ statt c++. Ich habe versucht swapping-Bibliothek um Aufträge. Auch ist es nicht ein template-Problem, da mindestens eine der Referenzen kann es nicht finden, ist nicht eine vorgefertigte Funktion. Ich habe gesucht, den Bibliotheken für die Symbole, und ich war in der Lage, Sie zu finden, obwohl Sie wurden vorangestellt und postpended von zufälligen Zeichen.
Ich verstehe nicht, was Los ist. Bitte helfen Sie.
Dank,
UPDATE
Fand ich einen weiteren link, speziell diese eine, dass die genannten potenziellen Probleme mit add_subdirectory. Dies ist ein Teilprojekt für ein anderes Projekt. Also schickte ich in das Projekt und baute es. Es hat geklappt! Es funktioniert immer noch nicht in das übergeordnete Verzeichnis wenn. Vielleicht können Hinweise geben, um jemanden.
Nochmals vielen Dank,
- Verwenden
c++filt
zu sehen, was die wirklichen Funktionsnamen sind-die scheinbar zufällige Zeichen sind ein Ergebnis des name mangling in C++ - ok. Ich habe
nm libdsp.so | c++filt | grep -i gen_lpf
zu finden, die Bibliothek, die ich suchte. Das war ziemlich genial. Danke für den Tipp. - Es scheint aproblem mit Ihren referenzierten Bibliothek, die nicht enthalten diese Dinge. Schauen Sie es und versuchen, zu prüfen, die lib Inhalt von diesem mit objdump. Vielleicht haben Sie nur vergessen zu kompilieren Sie in das "lib", oder der compiler optimiert Sie Weg.
- Wenn ich nm, ich sehe alles, was, die es sagt mir, dass es nicht finden können. Gleiche Sache mit objdump.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nicht davon ausgehen, dass das Verzeichnis mit CMakeLists.txt ist das aktuelle Verzeichnis zur Laufzeit. Verwenden Sie stattdessen
${CMAKE_CURRENT_SOURCE_DIR}
wenn Sie möchten, dass ein Pfad relativ zum CMakeLists.txt. Zum Beispiel:apbs: symbol lookup error: [...] undefined symbol: X
Fehler. Stellt sich heraus, es war verursacht durch eineinclude_directories('/src')
in der CMake-Datei. CMake wies mich in die richtige Richtung mit der Warnung: "Dieser Befehl legt den relativen Pfad, der als link-Verzeichnis. Politik CMP0015 nicht gesetzt werden: link_directories() behandelt werden Pfade relativ zum source-dir. Run "cmake --help-Politik CMP0015" für politische details. Verwenden Sie die cmake_policy Befehl, um die Politik und unterdrücken Sie diese Warnung." glaube, ich sollte gehört haben!