【问题标题】:How do I "CMake'ify" my inclusion of threads headers?我如何“CMake'ify”我包含的线程标题?
【发布时间】:2020-03-25 17:08:06
【问题描述】:

在我的一个源文件中,我有:

#ifdef __unix__
#include <pthread.h>
#else
#ifdef _WIN32
#include <processthreadsapi.h>
#endif // _WIN32
#endif // __unix__

(是的,这不是最棒的代码,但它受到我正在与之交互的另一个库的限制。)

现在,CMake 是让我与库挂钩以链接的机制;所以 - 我想使用与 CMake 完全相同的逻辑来决定是使用 WIndows 线程还是 pthreads。或者 - 让 CMake 为我做出这个决定。

我该怎么做?

我想让 CMake 为我决定这些事情

【问题讨论】:

  • 另一个要考虑的选项是 C++11 线程,如果它们适合您的需要的话。如果双方的编译器都足够新,并且没有其他原因无法使用它们,那么它的可移植性会更高,并且也会简化​​您的 CMake 配置。
  • @George:不幸的是,我需要它来与本身使用线程的 C 库进行交互,而且我受到它的限制。我想我会把这个问题重新归类为 C。

标签: c multithreading cmake pthreads


【解决方案1】:

我目前的想法是在CMakeLists.txt 中执行以下操作:

if(DEFINED CMAKE_USE_PTHREADS_INIT)
        target_compile_definitions(cuda-api-wrappers PUBLIC "CUDA_API_WRAPPERS_USE_PTHREADS");
else if(DEFINED CMAKE_USE_WIN32_THREADS_INIT)
        target_compile_definitions(cuda-api-wrappers PUBLIC "CUDA_API_WRAPPERS_USE_WIN32_THREADS");
endif()
endif()

然后在C++文件中写入:

#ifdef CUDA_API_WRAPPERS_USE_PTHREADS
#include <pthread.h>
#else
#ifdef CUDA_API_WRAPPERS_USE_WIN32_THREADS
#include <processthreadsapi.h>
#endif
#endif

但我想知道这是否是正确的方法。

【讨论】:

  • @ZuodianHu:我希望 CMake 有更多的技巧。
  • 我唯一想到的另一件事是使用configure_file,这或多或少是使用 CMake 变量进行预处理。
  • @ZuodianHu:是的,这是个好主意——但如果你有多个配置设置,而不仅仅是这个,那就更是如此。不过,也许它已经值得了。
猜你喜欢
  • 1970-01-01
  • 2017-02-17
  • 2020-05-24
  • 1970-01-01
  • 1970-01-01
  • 2021-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多