Ошибка компоновщика при использовании cinder и poco

Я пытаюсь использовать libcinder, чтобы сделать некоторые визуализации. При интеграции в мою существующую кодовую базу я столкнулся с некоторыми ошибками компоновщика, которые я не могу понять. Я свел проблему к минимальному примеру со следующими результатами:

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

Если вообще не использовать гари, все работает нормально, как показано выше. если я добавлю свою функцию в минимальный пример cinder (BasicApp), я получу следующий вывод при компиляции:

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

Я предполагаю, что какой-то набор настроек в файлах cinder cmake все портит, но я не понимаю, почему или как это исправить. Это с gcc версии 5.4.0 и cmake версии 3.5.1.

Вот уменьшенный файл cmake, который имеет эту проблему:

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)

Если закомментированные строки не закомментированы, это связывает в cinder, и вещи ломаются. Я использую файл FindPoco.cmake отсюда. Файлы cinder cmake находятся здесь.

Кажется, не имеет значения, каков порядок связывания, и ни одна из других библиотек, которые я использую, не имеет этой проблемы.

1 ответ

Вот и получается, что проблема в несовпадении ABI. Cinder поставляется с предварительно скомпилированными библиотеками boost, которые используют gcc версии <5.1, что приведет к конфликтам, если вы попытаетесь использовать библиотеки, скомпилированные с gcc version >= 5.1.

Мое исправление состояло в том, чтобы удалить предварительно скомпилированные библиотеки Boost cinder и перекомпилировать с версией boost в репозиториях Ubuntu.

Смотрите эту ветку на дискурсе для получения дополнительной информации.

Другие вопросы по тегам