在 CMake 阶段而不是生成阶段生成和运行C++代码

Build and run C++ code during CMake stage rather than build stage

本文关键字:段生成 运行 C++ 代码 CMake      更新时间:2023-10-16

我正在编写一个自定义 CMake 查找模块以使用第三方库,并希望提取其版本字符串以用于:

find_package_handle_standard_args(MySDK
                                  REQUIRED_VARS LIBRARY INCLUDE
                                  VERSION_VAR VERSION
)

但是,它的版本号在标题中不能作为文本提供,所以我必须构建一个小的c ++程序来将其打印到stdout:

#include <MySDK.h>
int main(int argc, const char * argv[]) {
    MySDK::Version version = MySDK::getVersion();
    std::cout << version.text << "n";
    return 0;
}

我尝试在我的自定义FindMySDK.cmake中添加如下内容:

file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/version.cpp"
"
#include <MySDK.h>
int main(int argc, const char * argv[]) {
    MySDK::Version version = MySDK::getVersion();
    std::cout << version.text << "\n";
    return 0;
}
"
)
add_executable(MySDKVersion
  EXCLUDE_FROM_ALL
  "${CMAKE_CURRENT_BINARY_DIR}/version.cpp"
)
target_include_directories(MySDKVersion SYSTEM PRIVATE ${MYSDK_INCLUDE_DIRS})
target_link_libraries(MySDKVersion ${MYSDK_LIBRARIES})
execute_process(COMMAND "$<TARGET_FILE:MySDKVersion>")

但它输出一个空字符串。有没有更好的方法来做这种事情?

您需要

使用 try_run 命令。

请注意,这在交叉编译时不起作用,

因为在交叉编译时,任何构建的二进制文件都无法在主机上运行。但是,当这是您的最后选择时,这就是您使用的。