在一个比较大的C++项目中,我们有很多包,每个包都有一个自己的src、include、CMakeLists.txt和其它文件,比如以下文件结构:
project- pkg1- datas- data.json- src- xxx1.cpp- include- xxx1.h - CMakeLists.txt- pkg2- src- xxx2.cpp- include- xxx2.h -CMakeLists.txtCMakeLists.txt
如果我们想要在xxx1.cpp中读取data.json,意味着要先获取路径path1=“project/pkg/datas/data.json”。path1可以通过先获取包的路径path2=“project/pkg1”,再添加"/datas/data.json"得到。
那么怎么获取包的路径path2="project/pkg1"呢?网上通过getcwd的方法(参考getcwd讲解,linux下要把<direct.h>替换成<dirent.h>,把_getcwd替换成getcwd)只能获取cmake之后可执行目标所在的文件路径(一般在build中),而不是pkg1的路径。
为了正确获取包的路径path2=“project/pkg1”,可以在pkg1下的CMakeLists.txt添加宏,然后再在xxx1.cpp中使用宏,具体做法如下:
在pkg1下的CMakeLists.txt中定义宏:
add_definitions(-DPROJECT_PATH="${PROJECT_SOURCE_DIR}")
在xxx1.cpp中使用宏:
// path的值为"project/pkg1"
string path = string(PROJECT_PATH);