C++ 如何处理make build与make install的配置文件路径

C++ 如何处理make build与make install的配置文件路径,c++,cmake,C++,Cmake,我的项目文件夹如下所示: foo/ --> Project name CMakeLists.txt build/ --> Run cmake.. and make. src/ app.h app.cc main.cc share/ foo/ config.txt const std::string CONFIG_FILE_PATH = "../share/foo/conf

我的项目文件夹如下所示:

foo/                --> Project name
  CMakeLists.txt
  build/            --> Run cmake.. and make.
  src/
    app.h
    app.cc
    main.cc
  share/
    foo/
      config.txt
const std::string CONFIG_FILE_PATH = "../share/foo/config.txt";
// make build
const std::string CONFIG_FILE_PATH = "/home/myuser/foo/share/foo/config.txt";

// make install
const std::string CONFIG_FILE_PATH = "/usr/share/foo/config.txt";
<>我希望我的C++代码能够找到<代码> CONFIG.TXT < /C>当我做一个<代码> make Bug <代码>,并且当我做一个<代码>时,安装< < />代码> 我尝试使用相对路径读取
config.txt
,如下所示:

foo/                --> Project name
  CMakeLists.txt
  build/            --> Run cmake.. and make.
  src/
    app.h
    app.cc
    main.cc
  share/
    foo/
      config.txt
const std::string CONFIG_FILE_PATH = "../share/foo/config.txt";
// make build
const std::string CONFIG_FILE_PATH = "/home/myuser/foo/share/foo/config.txt";

// make install
const std::string CONFIG_FILE_PATH = "/usr/share/foo/config.txt";
但我意识到这是相对于我运行二进制文件的文件夹运行的,而不是相对于二进制文件当前所在的位置

我希望路径如下所示:

foo/                --> Project name
  CMakeLists.txt
  build/            --> Run cmake.. and make.
  src/
    app.h
    app.cc
    main.cc
  share/
    foo/
      config.txt
const std::string CONFIG_FILE_PATH = "../share/foo/config.txt";
// make build
const std::string CONFIG_FILE_PATH = "/home/myuser/foo/share/foo/config.txt";

// make install
const std::string CONFIG_FILE_PATH = "/usr/share/foo/config.txt";

有什么魔法可以让我做到这一点吗?我肯定以前已经这样做过,但我不知道要搜索什么。

如果要从可执行文件中获取此可执行文件所在的目录,请查看以下问题:。通过了解可执行文件的目录,您可以计算其配置文件的路径。@Tsyvarev-感谢共享该链接。哇,太复杂了!所有应用程序都是这样做的吗?如果有那么复杂,为什么Linux选择使用这种格式,让二进制文件转到
/usr/bin
,并将配置转到
/usr/share
,而不是只有一个项目文件夹?对我来说似乎很奇怪。对于单个项目的文件夹,您将使用路径
+“/config.txt”
,在
/usr/bin
下使用二进制文件,在
/usr/share
下配置,您将使用路径
+“/../share/config.txt”
——差别不大。如果您不习惯在运行时计算可执行目录(
),则可以使用配置文件的绝对路径。这将使您的构建树无法使用,但谁在乎。。。或者,您可以从某个环境变量读取路径,只有在未设置环境变量的情况下才返回到绝对路径。实际上,有很多方法可以将配置文件的路径告知可执行文件。CMake与该问题基本无关,除了在生成可执行文件时可以使用
add\u compile\u definitions
定义宏。@Tsyvarev-感谢您的建议!我想我会按照你第一篇文章中的链接使用
readlink/proc/self/exe
。请你把上面的评论作为回答,我会接受你的?