C++ 如何使用Cmake获取libasan.so路径?

C++ 如何使用Cmake获取libasan.so路径?,c++,c,cmake,address-sanitizer,C++,C,Cmake,Address Sanitizer,我有一个共享库,其中包含项目的测试。这被用作测试框架。这允许使用cgreen运行程序运行所有测试,如下所示: cgreen-runner my-tests.so 我可以通过CMake很容易地做到这一点: add_test(NAME mytest COMMAND ${CGREEN_EXECUTABLE} ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/my-tests.so) 当我构建我的测试时,问题就来了。所以使用ASAN。因为它是用ASAN构建的共享库,由非用ASAN构

我有一个共享库,其中包含项目的测试。这被用作测试框架。这允许使用cgreen运行程序运行所有测试,如下所示:

cgreen-runner my-tests.so
我可以通过CMake很容易地做到这一点:

add_test(NAME mytest COMMAND ${CGREEN_EXECUTABLE} ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/my-tests.so)
当我构建
我的测试时,问题就来了。所以使用ASAN。因为它是用ASAN构建的共享库,由非用ASAN构建的可执行文件加载,所以我必须使用
LD_PRELOAD
,以便加载
libasan.so
(如所述)

从命令行执行此操作很容易,无需知道libasan的位置。因此,只要知道用于编译测试的编译器,就可以知道libasan的位置:

LD_PRELOAD=`gcc -print-file-name=libasan.so` cgreen-runner my-tests.so
我可以使用
set\u属性
从CMake设置
LD\u预加载

set_property(TEST mytest PROPERTY ENVIRONMENT "LD_PRELOAD=/path/to/libasan.so")

显然,我不想在那里有一个硬编码的路径。在配置cmake时,有没有办法获得此路径?

您只需从cmake调用命令:

execute_process(COMMAND gcc -print-file-name=libasan.so
                OUTPUT_VARIABLE LIBASAN_PATH
                OUTPUT_STRIP_TRAILING_WHITESPACE)

要捕获失败,您可以传递一个RESULT_变量,并检查其值是否等于0。

这可能有效。我认为最好使用
CMAKE_C_COMPILER
而不是直接使用
gcc
,因为有人可能会使用
clang
,我不确定在这种情况下事情是否会按预期工作。谢谢