我一直在尝试构建一个简单的C ++库。在使用相对路径构建的过程中,CMake无法正确配置我的链接库所在的位置。绝对路径配置成功。这是使我不能使用CMake的一些事情。建议路径的推荐方法是什么?它是绝对的还是相对的路径?为什么?
答案 0 :(得分:2)
给出:cmake -H/foo -B/bar
/foo/CMakeLists.txt
期间:
${CMAKE_CURRENT_SOURCE_DIR} = /foo
${CMAKE_CURRENT_BINARY_DIR} = /bar
在声明project(Foo)
${PROJECT_SOURCE_DIR} = /foo
${PROJECT_BINARY_DIR} = /bar
然后在声明add_subdirectory(foo2)
期间,即执行/foo/foo2/CMakeLists.txt
:
${CMAKE_CURRENT_SOURCE_DIR} = /foo/foo2
${CMAKE_CURRENT_BINARY_DIR} = /bar/foo2
${PROJECT_SOURCE_DIR} = /foo
${PROJECT_BINARY_DIR} = /bar
如果我们遇到另一个嵌套项目:project(Bar)
${CMAKE_CURRENT_SOURCE_DIR} = /foo/foo2
${CMAKE_CURRENT_BINARY_DIR} = /bar/foo2
${PROJECT_SOURCE_DIR} = /foo/foo2
${PROJECT_BINARY_DIR} = /bar/foo2
还有许多其他变量可以帮助您准确定位和定位文件,请参阅
https://cmake.org/Wiki/CMake_Useful_Variables
像add_executable
这样的命令会试图“弄清楚”非显式文件的位置,但在复杂的项目中,依赖它并不是一个好主意。最好明确地提供路径(使用可用的CMAKE变量)。
最后,如果你经常使用cmake,你会得出结论,源文件组织是它的弱点。
如果你像我一样幸运,你会偶然发现Sugar
包裹:
https://github.com/ruslo/sugar
所有源文件(和文档)问题都将消失。
如果你进行交叉编译,你会想要Polly:
https://github.com/ruslo/polly
如果你依赖普通的第三方图书馆,你可能会从亨特那里受益: