Cmake:如何在链接到多个程序的目标文件中引用文件?

时间:2019-09-01 21:22:20

标签: c++ cmake

我正在使用C ++和Cmake创建一些我希望人们能够轻松构建和运行的软件。克隆GitHub存储库将安装文件夹Project/,文件Project/src/navigation/camera/image.cpp中的代码将编译并链接到Project存储库中的多个程序。但是,在image.cpp内部,有一个文件Project/Models/model.txt的路径,并且该文件路径是相对于Project/build/navigation/camera/image.o的:

image.cpp

int processImage() {
     read_file("../../../Models/model.txt");
     // Do something
}

但是,由于目标文件已链接到整个项目中的其他程序,因此路径应相对于许多不同的位置。解决此问题的标准“软件工程”技术是什么?您是否告诉Cmake Project/的路径,并以某种方式让它在构建之前修改image.cpp?还是有办法仍然使用相对路径?

2 个答案:

答案 0 :(得分:1)

如果使用的是CMake,则典型的构建模型会将源树与构建树分开,这意味着您的构建文件夹可能位于相对于源文件夹的任何位置。因此,任何相对路径都无法可靠地工作。

如果我无法避免在源代码中使用硬编码路径,我最喜欢的解决方案是将cpp文件传递给CMake的configure函数,以将该相对路径替换为CMake将在其处计算的绝对路径生成时间

答案 1 :(得分:0)

我不知道这种方法有多“标准”,但是我期望Models必须是可执行文件执行目录的子目录。通常这是可执行文件最终出现的位置,但不是必须的。对于已发布的项目,此目录通常是(预期是)安装目录。需要说明的是,其他功能也可以更改当前工作目录,这将使您的代码更难找到model.txt。因此,我还期望在运行代码之前必须还原当前的工作目录。

如果您选择此路线,则数据文件的相对路径将为Models/model.txt。将每个数据复制到适当的目录(或创建从目录到数据文件的链接)取决于每个项目。请注意,每个项目可能仍要发布此配置,因为您通常不应(有时不能)访问安装目录的父目录。

相关问题