首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用cinder和poco时的链接器错误

使用cinder和poco时的链接器错误
EN

Stack Overflow用户
提问于 2017-06-30 02:27:48
回答 1查看 167关注 0票数 0

我正在尝试使用libcinder来进行一些可视化。在集成到我现有的代码库中时,我遇到了一些我无法确定的链接器错误。我已经将这个问题归结为一个最小的例子,结果如下:

代码语言:javascript
复制
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,则一切正常,如上图所示。如果我将我的函数添加到最小的cinder示例(BasicApp)中,我在编译时会得到以下输出:

代码语言:javascript
复制
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文件:

代码语言:javascript
复制
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中的链接就会断开。我使用的是来自here的FindPoco.cmake文件。cinder cmake文件位于here

链接顺序似乎并不重要,我使用的其他库都没有这个问题。

EN

回答 1

Stack Overflow用户

发布于 2017-07-02 01:47:23

所以事实证明这个问题是ABI不匹配。Cinder附带了预编译的boost库,这些库使用的是低于5.1版的gcc,如果您尝试使用已使用gcc >= 5.1版编译的库,则会导致冲突。

我的修复方法是删除cinder预编译的boost库,并使用ubuntu repos中的boost版本重新编译。

有关更多信息,请参阅cinder话语上的this帖子。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44832487

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档