【发布时间】:2015-01-11 13:27:15
【问题描述】:
假设我有这样的文件夹布局:
.
+-- Project
+-- src
+-- foo.h
+-- foo.cpp
+-- test
+-- test_foo.c
test_foo.c 看起来像这样:
#include "../src/foo.h"
#include <stdio.h>
#include <assert.h>
int main() {
assert(foo() == true);
printf("Test complete");
return 0;
}
有没有办法将#include "../src/foo.h" 行替换为指向源目录的变量?例如,假设在我的环境中我有一个变量:
PROJECT_SRC="./Project/src/"
然后我可以有这样的 include 指令:
#include "PROJECT_SRC/foo.h"
这很好,因为我可以有一个 bash 脚本来导出某个项目所需的所有路径。此外,如果该文件包含在不同的测试和构建文件中,我将不得不为每个文件设置相对路径(尽管工作量不大),这将不如一个绝对路径稳健。
另一种方法可能是像CMake 这样的工具可以做到这一点。或者这被认为是不好的做法?
【问题讨论】:
-
通常你在你的makefile和
-I选项中处理这样的问题来添加考虑搜索包含文件的路径。是的,使用 make(不是 CMake)。 -
为什么不直接使用符号链接呢?非常适合这种情况。 Visual Studio 中缺乏支持(编辑器无法识别两个不同的路径是同一个文件)使得在 Windows 中编辑的文件不太实用,但是(1)您使用的是 Linux,并且(2)您'不会通过链接编辑文件。
-
@Cheersandhth.-Alf Aaahrg!我的一位同事用他的符号链接构建树系统惹恼了其他所有人。使用 make 有更好的方法(例如,
vpath就是其中之一)。 -
您可以原则上使用宏作为标题名称,但我记得它很脆弱。我会在这个方向上接受任何建议,带着一粒盐。或更多。
标签: c++ linux include preprocessor-directive