我的目标是在我们庞大而古老的代码库中找到从未被调用过的程序。我们的代码称为 neci,主要是 Fortran 和一些 C/C++ 代码。从这个问题的最佳答案中,我偶然发现了很棒的工具callcatcher,但我很难将它与 cmake 结合起来。
当我callcatcher
通过手动编译一堆 Fortran 文件来使用时,一切正常并找到未使用的程序。
现在我想把这个工具嵌入到我们的cmake
编译过程中并使用。
cmake \
-DCMAKE_BUILD_TYPE=Debug \
-DCMAKE_Fortran_COMPILER=mpifort -DCMAKE_C_COMPILER=mpicc -DCMAKE_CXX_COMPILER=mpicxx \
-DCMAKE_Fortran_COMPILER_LAUNCHER=callcatcher -DCMAKE_C_COMPILER_LAUNCHER=callcatcher -DCMAKE_CXX_COMPILER_LAUNCHER=callcatcher \
-DCMAKE_Fortran_LINKER_LAUNCHER=callcatcher -DCMAKE_C_LINKER_LAUNCHER=callcatcher -DCMAKE_CXX_LINKER_LAUNCHER=callcatcher \
~/code/neci
然后计算机会发出以下警告:
CMake Warning:
Manually-specified variables were not used by the project:
CMAKE_Fortran_LINKER_LAUNCHER
事实上,当我编译时,VERBOSE=3 make -j neci
我看到文件已正确编译,callcatcher
但链接步骤并未在调用前添加callcatcher
.
我的问题是:
- 如何强制
cmake
在链接器命令前面加上callcatcher
? - 如果第一个问题隐藏了一个 XY 问题,我该如何解决我最初的目标,即在没有
callcatcher
.
我的 cmake 版本是 3.21.3。