如何告诉CMake使用相对路径

8
如果我创建了我的项目,我可以看到这个:
[ 50%] Building C object CMakeFiles/hello.dir/hello.c.obj
/cygdrive/c/users/me/Home/bin/iccarm  /cygdrive/c/users/me/Home/sandbox/iar/hello.c  -I/cygdrive/c/users/me/Home/sandbox/iar/foo -I/cygdrive/c/users/me/Home/inc   -o CMakeFiles/hello.dir/hello.c.obj

既然我总是在build目录下调用make,那为什么不使用相对路径来提高可读性,并实现跨操作系统的兼容性呢?

[ 50%] Building C object CMakeFiles/hello.dir/hello.c.obj
iccarm  hello.c -Ifoo -Iinc -o CMakeFiles/hello.dir/hello.c.obj

这不是更好吗?

有没有一种方法可以强制CMake尽可能使用相对路径?

2个回答

12

CMake总是使用绝对路径,这是其概念的一部分。因此,您无法移动生成的构建环境文件,也不能将它们纳入源代码控制或使冗长的输出更美观(您只能稍微尝试一下规则消息,例如这里)。

曾经有过一个CMAKE_USE_RELATIVE_PATHS,但文档揭示了:

此变量没有效果。在CMake 3.4中删除了其先前版本中部分实现的影响。

参考资料


1
这意味着 CMake 在 Cygwin 上将无法正常工作。这是一个非常令人沮丧的消息。我想知道为什么他们删除了 CMAKE_USE_RELATIVE_PATHS,它本来就很完美... - nowox
@nowox Cygwin 只能与 cygwin 版本的 CMake 配合使用,无法与 Windows 版本配合使用。我认为它被移除是因为它引起了很多问题(CMake bugtracker 上充满了这些问题)。 - Florian
被移除的是哪个?Windows版本还是Cygwin版本?绝对路径的主要问题在于,如果您使用为Windows构建的工具链,则编译器期望的是Windows路径。只要路径是相对的,它可以与Cygwin一起使用,但是一旦您获得了绝对路径,就必须编写一个绑定脚本,将丑陋的/cygwin/c/替换为C:... 如果CMake有一个选项可以实时执行此操作,那就太好了。 - nowox
@nowox 抱歉,我的意思是 CMAKE_USE_RELATIVE_PATHS 变量已被移除,因为它存在太多问题。 - Florian
4
绝对路径让我很头疼。我的源目录不能移动?这有什么好处吗? - noelicus

0

CMakes 从 CMake generator 获取路径。使用其他生成器(如 Ninja)默认情况下会产生相对路径。

您可以在运行 cmake 生成命令时使用 -G 选项。例如:

cmake .... -G Ninja

您还可以导出编译命令,这在大多数编辑器中浏览文件时非常有用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接