在CMake阶段而不是构建阶段构建和运行C ++代码

时间:2016-01-18 16:14:37

标签: c++ cmake

我正在编写一个自定义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>")

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

1 个答案:

答案 0 :(得分:1)

您需要使用try_run命令。

请注意,这在交叉编译时不起作用,因为交叉编译任何构建的二进制文件时都无法在主机上运行。但是,如果这是你的最后一个选择,那就是你使用的。