undefined reference to `boost::system::generic_category()'

undefined reference to `boost::system::generic_category()'

首先,在之前进行编译的时候发现了这个错误,才想到自己没有在CMakeLists.txt里面添加Boost的链接库。在骂自己白痴之后,在按照cmake的官方文档中所叙述的,添加了如下的cmake字段

1
2
3
4
5
6
7
8
9
10
find_package(Boost REQUIRED)
message(STATUS "Boost status:")
message(STATUS " version: ${Boost_VERSION} ${Boost_LIB_VERSION}")
message(STATUS " include path: ${Boost_INCLUDE_DIRS}")
message(STATUS " LIBS: ${Boost_LIBRARIES}")
message(STATUS " LIBS DIR ${Boost_LIBRARY_DIRS}")

include_directories(${Boost_INCLUDE_DIRS})

target_link_libraries(learnTriangulation ${Boost_LIBRARIES})

自己心里想的就是,这不就和OpenCV一个样子么,然后我就编译了,结果就开始报错

1
2
3
4
5
[build] CMakeFiles/learnTriangulation.dir/main.cpp.o: In function `__static_initialization_and_destruction_0(int, int)':
[build] main.cpp:(.text+0x128b): undefined reference to `boost::system::generic_category()'
[build] main.cpp:(.text+0x1297): undefined reference to `boost::system::generic_category()'
[build] main.cpp:(.text+0x12a3): undefined reference to `boost::system::system_category()'
[build] collect2: error: ld returned 1 exit status

???

我不是明明就添加进去了吗??

然后我又重新cmake config了一下,才发现,?,为啥${Boost_LIBRARIES}是空的?

于是我加了一个小判断

1
2
3
4
5
6
7
if(NOT Boost_FOUND)
message("not found BOOST")
endif()

if(NOT Boost_LIBRARIES_FOUND)
message("not found boost lib")
endif()

然后遇到了迷惑的输出

1
2
3
4
5
6
[cmake] Boost status:
[cmake] version: 105800 1_58
[cmake] include path: /usr/include
[cmake] LIBS:
[cmake] LIBS DIR /usr/lib
[cmake] not found boost lib

我自然就觉得肯定是我没找到这个库所以才会产生之前的报错。尝试使用各种方法无果之后,我看到了这一条

以及里面引用的这一条,按照说明添加上了这句话

1
add_definitions(-DBOOST_ERROR_CODE_HEADER_ONLY)

然后居然真的就build通过了 = =

先把问题记录在这,之后在康康能不能给个解释


2019.12.11 更新

在调研了之后在网上找到如下两个帖子,分别阐述了这个问题。其中一个解释为是boost本身的bug,另一个解释是cmake查找不对。

之前的链接中找到,其实使用上面那个定义会有一定问题,在1.66版本之前的boost库都有这样的问题,所以在使用的过程中可以用这个进行代替

1
add_definitions(-DBOOST_SYSTEM_NO_DEPRECATED)

在实际进行这样操作之后,在build的过程中仍然出现了一个问题

1
2
3
[build] [100%] Linking CXX executable learnboost
[build] CMakeFiles/learnboost.dir/main.cpp.o: In function `boost::filesystem::detail::dir_itr_imp::~dir_itr_imp()':
[build] /usr/include/boost/filesystem/operations.hpp:775: undefined reference to `boost::filesystem::detail::dir_itr_close(void*&, void*&)'

又一次说我没有增加filesystem的引用。。参考这篇文章之后也没有太大用处.。