CMAKE 找不到BOOST原因分析

原理

通过看CMAKE module里的FindBoost.cmake文件大致明白了cmake找库的方式,一般的库就给个根目录路径,然后cmake通过预设的宏来逐个寻找包含文件目录,库目录,库文件等等。

简单的说就是根据经验知道某个库安装的文件组织架构是怎么样的,然后去搜索,而cmake提供了很多种可能的情形。然而这些情形并不能包含所有情况,因此会经常出现找不到的情形。

譬如你移动一下文件夹的位置,改个文件夹的名字,改静态库的名字都会使得cmake找不到boost。

因此解决的方案有两种:将你的boost恢复成正确的架构,或者修改FindBoost.cmake

可以参考的有这几个:库目录文件夹名字不对,32位64位引起的问题

BOOST静态库命名规则

以debug版本为例,你下载的boost库命名方法可能涉及到了lib前缀,boost名字,库名,编译器名,debug标记,计算机架构,库版本,多线程,静态标记等等。

CMAKE 找不到BOOST原因分析_第1张图片

解决方案

我在后面加了一句 message("${_boost_DEBUG_NAMES}") 打印到cmake控制台,发现预设的名字有这些:boost_filesystem-vc141-mt-gd;boost_filesystem-vc140-vc140-gd-1_64;boost_filesystem-vc140-mt-gd;boost_filesystem-vc140-mt-gd;boost_filesystem-mt-gd-1_64;boost_filesystem-mt-gd;boost_filesystem-mt-gd;boost_filesystem-mt;boost_filesystem

而我的boost名字是libboost_filesystem-vc140-mt-gd-1_64.lib,区别很明显差了一个lib,因此解决方案就很了然了,在cmake里加个entry Boost_LIB_PREFIX  类型设为STRING,值设为lib就可以了。

然而意外的是release版本的库都找到了,debug没有找到。仔细核对了输出的类型列表发现的确没有这个命名方式,因此还得在findboost.cmake里架设我的boost的命名规则。

在foreach(compiler IN LISTS _boost_COMPILER)循环体最后一行添加

${Boost_LIB_PREFIX}${Boost_NAMESPACE}_${component}${compiler}${_boost_MULTITHREADED}${_boost_DEBUG_ABI_TAG}-${Boost_LIB_VERSION}

保存之后再cmake 就都找得到了

 

以上问题为编译UrbanReg时遇到

你可能感兴趣的:(cmake,boost)