2017-06-29 2 views
0

Ich versuche Libcinder zu verwenden, um einige Visualisierungen zu machen. Bei der Integration in meine vorhandene Codebase sind einige Linkfehler aufgetreten, die ich nicht herausfinden kann. Ich habe das Problem auf ein minimales Beispiel mit den folgenden Ergebnissen gekocht:Linker Fehler bei der Verwendung von Asche und Poco

cd /build/src && /usr/bin/cmake -E cmake_link_script CMakeFiles/BasicApp.dir/link.txt --verbose=1 
/usr/bin/c++ -O3 -DNDEBUG CMakeFiles/BasicApp.dir/BasicApp.cpp.o -o ../bin/BasicApp -rdynamic -lPocoUtil -lPocoFoundation 
make[2]: Leaving directory '/build' 
[100%] Built target BasicApp 
make[1]: Leaving directory '/build' 
/usr/bin/cmake -E cmake_progress_start /build/CMakeFiles 0 

Wenn überhaupt nicht beteiligt Zunder, alles gut funktioniert, wie oben zu sehen. wenn ich meine Funktion der minimalen Zinder Beispiel (BasicApp) hinzufügen, ich die folgende Ausgabe auf Zusammenstellung erhalten:

cd /build/src && /usr/bin/cmake -E cmake_link_script CMakeFiles/BasicApp.dir/link.txt --verbose=1 
/usr/bin/c++ -O3 -DNDEBUG CMakeFiles/BasicApp.dir/BasicApp.cpp.o -o ../bin/BasicApp -rdynamic -lPocoUtil -lPocoFoundation /cinder/lib/linux/x86_64/ogl/Release/libcinder.a -lGLU -lGL -lSM -lICE -lX11 -lXext -lXcursor -lXinerama -lXrandr -lXi -lz -lcurl -lfontconfig -lpulse -lmpg123 -lsndfile -lgobject-2.0 -lglib-2.0 -lgstreamer-1.0 -lgstbase-1.0 -lgstapp-1.0 -lgstvideo-1.0 -lgstgl-1.0 /cinder/lib/linux/x86_64//libboost_system.a /cinder/lib/linux/x86_64//libboost_filesystem.a -ldl -lpthread 
CMakeFiles/BasicApp.dir/BasicApp.cpp.o: In function `load_images(std::string, std::string, int, int)': 
BasicApp.cpp:(.text+0xca2): undefined reference to `Poco::DirectoryIterator::DirectoryIterator(std::string const&)' 
BasicApp.cpp:(.text+0xd57): undefined reference to `Poco::DirectoryIterator::DirectoryIterator(std::string const&)' 
collect2: error: ld returned 1 exit status 
src/CMakeFiles/BasicApp.dir/build.make:118: recipe for target 'bin/BasicApp' failed 
make[2]: *** [bin/BasicApp] Error 1 
make[2]: Leaving directory '/build' 
CMakeFiles/Makefile2:1244: recipe for target 'src/CMakeFiles/BasicApp.dir/all' failed 
make[1]: *** [src/CMakeFiles/BasicApp.dir/all] Error 2 
make[1]: Leaving directory '/build' 
Makefile:138: recipe for target 'all' failed 
make: *** [all] Error 2 

Ich gehe davon aus, dass einige Konfiguration in den Zinder cmake Dateien eingestellt ist Unordnung Dinge, aber ich don verstehe nicht warum oder wie ich es beheben kann. Dies ist mit gcc Version 5.4.0 und cmake Version 3.5.1. Hier

ist eine reduzierte cmake-Datei, die dieses Problem hat:

cmake_minimum_required(VERSION 3.2) 
project(segslam C CXX) 
set(CMAKE_CXX_STANDARD 11) 

list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake/poco") 

find_package(Poco REQUIRED) 

#include($ENV{CINDER_PATH}/proj/cmake/configure.cmake) 
#set(cinder_DIR $ENV{CINDER_PATH}/${CINDER_LIB_DIRECTORY}) 
#find_package(cinder REQUIRED PATHS " $ENV{CINDER_PATH}/${CINDER_LIB_DIRECTORY}") 



add_executable(BasicApp BasicApp.cpp) 

#target_include_directories(BasicApp PUBLIC $ENV{CINDER_PATH}/include) 
#target_link_libraries(BasicApp cinder) 


target_link_libraries(BasicApp ${Poco_LIBRARIES}) 

set_target_properties(BasicApp PROPERTIES 
    DEBUG_POSTFIX "d" 
    RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin") 

install(TARGETS BasicApp RUNTIME DESTINATION bin COMPONENT main) 
install(FILES ${srcs} DESTINATION app COMPONENT main) 

Wenn die kommentierten Zeilen unkommentiert sind, es verbindet in Zinder und Dinge brechen. Ich verwende eine FindPoco.cmake-Datei von here. Die Akten cmake Dateien befinden sich here.

Es scheint nicht wichtig, was die Verknüpfungsreihenfolge ist, und keine der anderen Bibliotheken, die ich verwende, haben dieses Problem.

+1

Zeigen Sie uns Ihren CMake-Code. – arrowd

+0

@arrowd Ich habe meinen CMake-Code zu der Frage hinzugefügt. – voxelite

Antwort

1

So stellt sich heraus, dass das Problem eine ABI-Mismatch ist. Cinder wird mit vorkompilierten Boost-Bibliotheken geliefert, die eine GCC-Version < 5.1 verwenden, die zu Konflikten führen wird, wenn Sie versuchen, Bibliotheken zu verwenden, die mit gcc-Version> = 5.1 kompiliert wurden.

Mein Fix war, die vorkompilierten Boost-Bibliotheken zu entfernen und mit der Boost-Version in den Ubuntu-Repos neu zu kompilieren.

Siehe this Thread auf der Aschen Diskurs für weitere Informationen.

Verwandte Themen