gpt4 book ai didi

c++ - Cmake - 如何复制带有输入数据的文件以构建输出文件夹

转载 作者:太空宇宙 更新时间:2023-11-04 01:49:39 25 4
gpt4 key购买 nike

我正在使用 CLion 和 CMake 进行项目构建。我已经创建了 Google Test 构建配置,我的项目树如下所示:

project tree

tokenizer 的测试很简单:tokenizer 应该打开源文件并输出 token 。

这是我的 tokenizer_test 的 CMakeLists.txt 文件:

include_directories(${gtest_SOURCE_DIRS}/include ${gtest_SOURCE_DIRS})
add_subdirectory(test_src)
add_executable(run_tokenizer_tests
tokenizer_test.cpp ${CMAKE_SOURCE_DIR}/includes/tokenizer.h
${CMAKE_SOURCE_DIR}/src/tokenizer.cpp
)

target_link_libraries(run_tokenizer_tests gtest gtest_main)

我是否可以将测试源(如图片中的 0.cpp)放在可执行文件附近,或者我应该编写自己的测试脚本吗?我该怎么做?

最佳答案

您可以调用file(COPY source DESTINATION ${CMAKE_CURRENT_BINARY_DIR})

参见 https://cmake.org/Wiki/CMake_Useful_Variables对于其他变量。

这是我们项目中执行此操作以及其他操作的代码片段。

总的来说,如果您的构建目录是事件的,这个片段可以让您避免依赖文件系统上的特定文件位置,因为文件路径将在您的单元测试中被硬编码。

它简化了自动构建和检查 - 在调用测试运行器之前无需跟踪 cd 的位置。

它还提高了单元测试中代码的可读性。

CMakeLists.txt:

# list all test images

set(test_data

orig_5_15Fps_3_27.png
orig_5_15Fps_5_34.png
....
)

# Loop over all items in the "test_data" list
# Copy PNG, JPEG and BMP images to the directory, where test binaries are created
# And generate full paths to them for hardcoding in the include file test_config.h

foreach(df ${test_data})

# copy images to build dir

if(${df} MATCHES "((jp|pn)g|bmp)$")
file(COPY ${df} DESTINATION ${CMAKE_CURRENT_BINARY_DIR})
set(df_file_path ${CMAKE_CURRENT_BINARY_DIR}/${df})
else()
set(df_file_path ${CMAKE_CURRENT_SOURCE_DIR}/${df})
endif()

# generate some C++ code in CMake variables IMAGE_PATHS and IMAGE_IDS
# (see below)

if (NOT IMAGE_PATHS)
set(IMAGE_PATHS " \"${df_file_path}\"")
else()
set(IMAGE_PATHS "${IMAGE_PATHS},\n \"${df_file_path}\"")
endif()

string(REGEX REPLACE "[^a-zA-Z0-9]" "_" df_id ${df})

if (NOT IMAGE_IDS)
set(IMAGE_IDS " img_${df_id}")
else()
set(IMAGE_IDS "${IMAGE_IDS},\n img_${df_id}")
endif()
endforeach()

set(TEST_PATH \"${CMAKE_CURRENT_BINARY_DIR}\")

configure_file(test_config.h.in test_config.h @ONLY) # see below for test_config.h.in

...
include_directories( ${CMAKE_CURRENT_BINARY_DIR} ) # make test_config.h visible for compiler
add_executable (some_unit_test some_unit_test.cpp)
add_test(NAME some_unit_test COMMAND some_unit_test WORKING_DIRECTORY ${EXECUTABLE_OUTPUT_PATH})
...
add_executable ( ... )
add_test( ... )
...

文件 test_config.h.in

/* DO NOT EDIT THIS FILE, IT IS AUTOGENERATED!
All your changes will be overwritten.

If you want to add new test data files,
add them to the `test_data` list in file CMakeLists.txt
*/

#ifndef __TEST_CONFIG_H__
#define __TEST_CONFIG_H__

const char* test_path = @TEST_PATH@; //!< full path to test data, without trailing slash

//! full paths to all test images
const char* image_paths[] = {
@IMAGE_PATHS@
};

enum image_ids { //!< test file names, converted to enum constants
@IMAGE_IDS@
};

#endif

调用 configure_file@TEST_PATH@@IMAGE_PATHS@@IMAGE_IDS@ 替换为其值。

这是构建目录中的配置文件 test_config.h 的样子。

/* DO NOT EDIT THIS FILE, IT IS AUTOGENERATED!
All your changes will be overwritten.

If you want to add new test data files,
add them to the `test_data` list in file CMakeLists.txt
*/

#ifndef __TEST_CONFIG_H__
#define __TEST_CONFIG_H__

const char* test_path = "F:/projects/project/build64/test"; //!< full path to test data, without trailing slash


//! full paths to all test images
const char* image_paths[] = {
"F:/projects/project/build64/test/orig_5_15Fps_3_27.png",
"F:/projects/project/build64/test/orig_5_15Fps_5_34.png",
...
};

enum image_ids { //!< test file names, converted to enum constants
img_orig_5_15Fps_3_27_png,
img_orig_5_15Fps_5_34_png,
...
};

#endif

在测试中使用:

#include "test_config.h"
....
img0 = cv::imread(image_paths[img_orig_5_15Fps_3_27_png], cv::IMREAD_GRAYSCALE);

enum image_ids 用于image_paths 数组中的可读索引。恕我直言,它比 image_paths[0] 好得多,因为它清楚地显示了读取的图像。

关于c++ - Cmake - 如何复制带有输入数据的文件以构建输出文件夹,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46646593/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com