如何用Cmake获取libasan.so路径?
How to obtain the libasan.so path with Cmake?
我有一个共享库,其中包含一个项目的测试。这是使用 Cgreen 作为测试框架。这允许使用 cgreen 运行ner 进行 运行 所有测试,如下所示:
cgreen-runner my-tests.so
我可以很容易地从 CMake 中做到这一点:
add_test(NAME mytest COMMAND ${CGREEN_EXECUTABLE} ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/my-tests.so)
当我使用 ASAN 构建 my-tests.so
时出现问题。因为它是一个用 ASAN 构建的共享库,由一个不是用 ASAN 构建的可执行文件加载,所以我必须使用 LD_PRELOAD
才能加载 libasan.so
(如 ASAN FAQ 所涵盖)。
这很容易从命令行完成,不需要知道 libasan.so
的位置,只要您知道用于编译测试的编译器即可:
LD_PRELOAD=`gcc -print-file-name=libasan.so` cgreen-runner my-tests.so
我可以使用 set_property
:
从 CMake 设置 LD_PRELOAD
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_VARIABLE 并检查其值是否等于 0。
我有一个共享库,其中包含一个项目的测试。这是使用 Cgreen 作为测试框架。这允许使用 cgreen 运行ner 进行 运行 所有测试,如下所示:
cgreen-runner my-tests.so
我可以很容易地从 CMake 中做到这一点:
add_test(NAME mytest COMMAND ${CGREEN_EXECUTABLE} ${CMAKE_LIBRARY_OUTPUT_DIRECTORY}/my-tests.so)
当我使用 ASAN 构建 my-tests.so
时出现问题。因为它是一个用 ASAN 构建的共享库,由一个不是用 ASAN 构建的可执行文件加载,所以我必须使用 LD_PRELOAD
才能加载 libasan.so
(如 ASAN FAQ 所涵盖)。
这很容易从命令行完成,不需要知道 libasan.so
的位置,只要您知道用于编译测试的编译器即可:
LD_PRELOAD=`gcc -print-file-name=libasan.so` cgreen-runner my-tests.so
我可以使用 set_property
:
LD_PRELOAD
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_VARIABLE 并检查其值是否等于 0。