2

我需要通过 CMake 脚本确定任意文件中的字节数,但要以可移植的方式进行。

该文件可能很大,因此使用 file(READ...) 命令读取它并计算字符串长度并不是最佳的。

如果我只需要在 MacOS 和/或 Linux 上运行,我只会使用wc -c,这正是我想要的。但是脚本需要与 Windows 兼容,假设只有 Windows 工具链。(我对 Windows 开发不是很了解。)

cmake -E我希望这是一个常见的操作,但是在 CMake Modules 源代码中没有找到任何类似的东西(可能是在搜索错误的东西),并且命令的 andy 似乎不支持它。

因此,我正在寻找一种通过单个命令获取此信息的巧妙方法,或者寻找关于我可以在 Windows 中使用哪些命令并环绕if(WIN32)条件的建议。

4

3 回答 3

3

不确定你是否会喜欢这个,但我认为编译和运行一个小型 C 程序并使用它的输出将是最简单的方法。毕竟,您需要做的是非常定制的,但在 C 中很容易做到。

cmake_minimum_required(VERSION 2.8)
project(test)

try_run(RUN_RESULT COMPILE_RESULT ${CMAKE_CURRENT_BINARY_DIR}/bin
    ${CMAKE_CURRENT_SOURCE_DIR}/filesize.c
    RUN_OUTPUT_VARIABLE FILE_SIZE
    ARGS ${CMAKE_CURRENT_SOURCE_DIR}/bigfile)

if (NOT COMPILE_RESULT)
    message(FATAL_ERROR "Filesize failed to compile")
endif()

if (RUN_RESULT EQUAL 0)
    message(STATUS "Filesize ${FILE_SIZE}")
else()
    message(WARNING "Filesize failed")
endif()

在文件大小.c 中:

#include <stdio.h>
int main(int argc, const char *argv[])
{
        FILE *fp = fopen(argv[1], "rb");
        if (fp != NULL) {
                fseek(fp, 0, SEEK_END);
                printf("%d", ftell(fp));
                fclose(fp);
                return 0;
        }
        return 1;
}

COMPILE_RESULT 是 TRUE 或 FALSE。如果找不到文件,try_run 会返回错误(在 RUN_RESULT 中)。否则,cmake 会运行程序,该程序会查找文件末尾并以字节为单位打印大小。结果被捕获在 FILE_SIZE 变量中。

唯一的问题是它不适用于交叉编译,因为在这种情况下 try_run 不会运行任何东西。

于 2011-06-30T15:17:16.987 回答
3

有一个名为FileInformation的 CMake 模块,可让您以可移植的方式获取文件的大小。它向 CMake 的内置命令添加了一个新的子file命令:

file (SIZE filename variable)
于 2011-07-02T16:19:40.367 回答
1

好吧,对于短文件,您可以执行以下操作:

function(get_file_size var filename)
    file(READ "${filename}" content HEX)
    string(LENGTH "${content}" content_length)
    math(EXPR content_length "${content_length} / 2")
    set(${var} ${content_length} PARENT_SCOPE)
endfunction()

get_file_size(len "main.c")
message(STATUS "len(main.c)=${len}")
于 2015-05-03T05:31:48.803 回答