![5ef1b311c3b95c03bdee9a36d5fac823.png](https://img-blog.csdnimg.cn/img_convert/5ef1b311c3b95c03bdee9a36d5fac823.png)
在Github上下个什么C++的库,大概率可以用CMake来生成各种IDE的项目文件并且编译。有时候有的库会依赖别的库,这样在Windows上就有点问题了,因为Windows没有Linux那样统一的程序安装位置,CMake常常找不到依赖的位置。这里有个比较方便的办法,让CMake可以找到依赖。
不科学的方法
先说一下不科学的办法,本人之前一直是这么搞的。
例如下载个SDL2,下载个RecastNavigation,后者依赖前者。先编译好SDL2,然后用CMake试图编译Recast。直接Configure,会报错,因为找不到SDL2。
![4de02af4179af583981d1dd0d1c2a004.png](https://img-blog.csdnimg.cn/img_convert/4de02af4179af583981d1dd0d1c2a004.png)
最后三行,三个NOTFOUND。然后之前是怎么做的呢,直接一个个地,把这三个CMake变量设置成之前编译SDL2的位置。然后再Configure,就可以了。
想想,这种办法是非常不科学的,每次都要指定三个文件夹,其实完全上可以一次搞定。
在Linux上估计不用这么麻烦,因为可以直接apt-get install xxx-dev,就算自己编译,也(默认)会install到/usr/local/文件夹下,然后被CMake直接找到,一次性Configure成功。
INSTALL
CMake出来的Visual Studio解决方案里,大多有个INSTALL项目。之前总是完全忽略这个项目,恰好,编译solution的时候,这个又默认被忽略,其实这个很有用。
![f4704d5f6c99f28f21469fcab862fd8e.png](https://img-blog.csdnimg.cn/img_convert/f4704d5f6c99f28f21469fcab862fd8e.png)
这个项目下只有一个Post-Build Event,没有代码什么的,其作用就是把编译好的东西“安装”到某个路径下,在Windows上,就基本是复制了。这个项目直接Build整个solution的时候会被跳过去。
![ab9151b228f04c9540fc0501fc98c81f.png](https://img-blog.csdnimg.cn/img_convert/ab9151b228f04c9540fc0501fc98c81f.png)
需要用鼠标指向这个INSTALL项目,右击-Build。
那么,复制到哪个地方呢?这就是CMAKE_INSTALL_PREFIX
指定的路径。很不幸,在Windows上默认是C:Program Files (x86)。如果不改的话,会失败,权限错误之类。我们这里换个位置,把CMAKE_INSTALL_PREFIX
换成了E:/CMake Program Files/SDL2。
再点Configure-Generate,在Visual Studio里,右击INSTALL-Build,在Output里会发现,关键的文件都被拷贝到这个文件夹下了。
![e71bda951304edc0c67b595fb1a848b0.png](https://img-blog.csdnimg.cn/img_convert/e71bda951304edc0c67b595fb1a848b0.png)
比较科学的方法
再来看Recast的编译,这里,不要再一个个指定INCLUDE,LIBRARY之类的东西了,直接增加一个变量,点cmake-gui上的 Add Entry按钮,增加一个变量,CMAKE_PREFIX_PATH
,里面写SDL2刚才INSTALL的位置E:/CMake Program Files/SDL2。(运气好的话,E:/CMake Program Files/就可以,大概取决于写FindXXX.cmake的人。)
![fc90d4dfab939adcc0dcf0c8b7620b75.png](https://img-blog.csdnimg.cn/img_convert/fc90d4dfab939adcc0dcf0c8b7620b75.png)
这时再Configure,会直接成功!再也不用一点点指定头文件和库的位置了!
![9dac44dd073322dc7703ce37d5ddb09a.png](https://img-blog.csdnimg.cn/img_convert/9dac44dd073322dc7703ce37d5ddb09a.png)
顺便把Recast的CMAKE_INSTALL_PREFIX
也换成我们的CMake Program Files,Configure-Generate-Open Project,然后 右击INSTALL-Build,等编译好执行完,库和Demo就自动跑到相应的位置了。
![39e0129c1e6100adcbb0cfd78b934d17.png](https://img-blog.csdnimg.cn/img_convert/39e0129c1e6100adcbb0cfd78b934d17.png)
如果有什么别的项目依赖Recast,同理设置一下CMAKE_PREFIX_PATH
,也不用一点点Recast的指定头文件和库了。 这个PATH应该可以用分号分割,填多个路径。
其他
build文件夹的位置
最好把build文件夹放到源代码之外。例如这样:
![62e562f0ddc76b9d88b46f6db9dd129e.png](https://img-blog.csdnimg.cn/img_convert/62e562f0ddc76b9d88b46f6db9dd129e.png)
recastnavigation-master是Github上下载的项目文件夹,build是自己建的空文件夹,然后在build文件夹下打开Powershell,执行
build> cmake-gui ..recastnavigation-master
文档
关键文档,搜cmakefind_package
。
让cmake打印出所有搜索过的路径(需要最新的测试版cmake)cmake命令行里加上 --debug-find
其他方法
好像也可以在环境变量加一个SDL2_DIR,让CMake自动找到位置,没测试过。