2

我正在FindXXX.cmake为外部 C 库编写脚本。我希望我的脚本提供有关库版本的信息。但是,该库仅以函数的形式提供此信息,该函数将版本号作为字符串返回。

FindXXX.cmake我想我可以通过即时编译以下 C 程序来提取版本号:

#include <stdio.h>
#include "library.h"

int main() {
  char version[256];
  get_version(version);
  puts(version);
  return 0;
}

为了让它工作,CMake 应该在配置时编译和运行上面的程序,并使用它打印的信息作为版本标识符。我知道如何做后者(execute_process),我几乎知道如何做前者:CheckCSourceRuns想到了,但我不知道如何捕获生成的可执行文件的标准输出。

TL; DR:有没有办法编译一个程序,运行它并在生成时从 CMake 捕获它的标准输出?

4

1 回答 1

3

你可以使用try_run来达到这个目的(假设你的源文件被命名为foo_get_version.c):

try_run(foo_run_result foo_compile_result
        foo_try_run ${CMAKE_CURRENT_LIST_DIR}/foo_get_version.c
        RUN_OUTPUT_VARIABLE foo_run_output)

if(NOT foo_compile_result)
    # ... Failed to compile
endif()
if(NOT foo_run_result EQUAL "0")
    # ... Failed to run
endif()

# Now 'foo_run_output' variable contains output of your program.

注意,交叉编译try_run时不会执行。相反,CMake 期望用户设置缓存变量和.foo_run_resultfoo_run_result__TRYRUN_OUTPUT

于 2016-11-25T09:02:15.553 回答