【发布时间】:2021-01-04 17:52:01
【问题描述】:
我最近在编译以下 C++ 程序时发现了一些奇怪的东西:
int main() { return 0; }
在 Linux 上使用 g++。具体来说,我使用以下两个命令将程序(位于/a/directory)编译了两次:
-
g++ -g -o main main.cc和 -
g++ -g -o /a/directory/main /a/directory/main.cc。
对于我输入的每个程序gdb main,输入break main 并运行程序。当 gdb 遇到断点时,我得到了以下结果:
- 断点 1、
main ()main.cc:1和 - 断点 1,
main ()/a/directory/main.cc:1。
简单地说,g++ 在编译时使用调试符号在二进制文件中嵌入对源目录的引用。更重要的是,这个目录是传递给编译器的(字面意思,不是规范化的)目录(这可以通过使用strings 检查二进制文件来确认)。
显然,cmake 构建执行 g++ 的方式是目录是绝对的,至少在构建外源代码时是这样。相反,我遇到了一个autotools 托管项目,其中源目录是本地目录。
其实有valid reasons是为了避免使用绝对构建目录,所以想了解一下:
我可以使用某些编译器选项来影响放入库/可执行文件的源目录吗?使用 cmake 时如何为整个项目完成此操作(例如设置相对于项目根目录的目录)?
其次,我想知道在 Linux 上是否有关于源目录的约定。理想情况下,可以安装源代码,而gdb 之类的工具将使用$PATH 之类的源代码来获取实际位置。
【问题讨论】:
-
1.您似乎已经在影响源路径目录。你需要别的方法吗? 2. 所以在
makefile或你的构建工具中使用$PATH。 -
好吧,在
cmake我无法控制编译发生的目录。这就是我问的原因。如果有编译器标志,那么我可以将其添加到CMAKE_CXX_FLAGS。 -
您可以在运行 CMake 时使用
-verbose选项来查看确切发布的编译器命令行,并将这些与其他构建系统中的命令行进行比较。 -
cmake不使用任何编译器标志,它只是在编译期间使用版本 2。看起来cmake并没有有意影响源目录。据推测,autotools使用版本 1。 -
@hfhc2 这可能有点帮助:stackoverflow.com/questions/45083285/…
标签: c++ linux debugging cmake compiler-options