小编ima*_*age的帖子

CMake 依赖管理

我正在寻找有关正确 CMake 依赖管理的一些见解。我遇到过ExternalProjectFetchContent,两者都不能完全满足我的需求。我来详细解释一下:

\n

我的项目具有以下结构:

\n
main_project/\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 CMakeLists.txt\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 external/\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 submodule1/\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 submodule2/\n\xe2\x94\x82   \xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 submodule3/\n\xe2\x94\x82   .\n\xe2\x94\x82   .\n\xe2\x94\x82   .\n
Run Code Online (Sandbox Code Playgroud)\n

每个submoduleN都是一个 git 子模块,其中包含一个完整的 CMake 项目及其自己的安装目标。我可以完全控制这些子模块(我编写它们)。我想使用安装目标,因为它们为子模块提供外部接口(具有适当的命名空间等)。我不想使用内部构建目标。我想用它find_package来解决依赖关系。

\n

其次,我不想使用某些下载机制来获取和部署依赖项。我想为此使用 git 子模块,因为

\n
    \n
  • 我可以冻结主项目中的子模块版本(依赖项版本管理)。
  • \n
  • 我可以轻松签出任何其他版本以进行调试(无需编辑文件,只需使用 git 并手头有完整的提交消息以供参考)。
  • \n
\n

假设每个submoduleN都有自己的、相似的子结构,并且它们可能在内部相互依赖。如果他们碰巧有共享依赖项,我希望他们使用单一的通用版本。主项目中的层次结构优先选择版本。例如,类似于FetchContent\ 的 populate 习语:

\n
FetchContent_GetProperties(mylib)\nif(NOT mylib_POPULATED)\n  FetchContent_Populate(mylib)\n  # do build, install and other stuff\nendif()\n
Run Code Online (Sandbox Code Playgroud)\n

我希望安装目标可以在配置步骤(即find_package)中使用,并且如果我编辑它们(即在其中应用一些调试更改),我希望重建它们submoduleN

\n

问题:

\n
    \n …

c c++ git cmake dependency-management

9
推荐指数
1
解决办法
1774
查看次数

编译时间断言不可靠?

我正在阅读《现代C ++设计》一书的第一章。特别是,编译时间断言。我的以下代码有问题:

template<bool> struct CompileTimeChecker
{
  CompileTimeChecker(...) {}
};

template<> struct CompileTimeChecker<false> {};

#define STATIC_CHECK(expr, msg)\
{\
  struct ERROR_##msg {ERROR_##msg() {}};\
  CompileTimeChecker<((expr) != 0)>(ERROR_##msg());\
}

int main()
{
  STATIC_CHECK(0, MessageNull);
  STATIC_CHECK(1, MessageOne);
}
Run Code Online (Sandbox Code Playgroud)

对于g ++ 7.4.0和clang ++ 6.0.0,这不会引发编译时错误。但是,以下代码确实引发了错误(按预期):

template<bool> struct CompileTimeChecker
{
  CompileTimeChecker(...) {}
};

template<> struct CompileTimeChecker<false> {};

#define STATIC_CHECK(expr, msg)\
{\
  struct ERROR_##msg {ERROR_##msg(int i) {i;}};\
  CompileTimeChecker<((expr) != 0)>(ERROR_##msg(0));\
}

int main()
{
  STATIC_CHECK(0, MessageNull);
  STATIC_CHECK(1, MessageOne);
}
Run Code Online (Sandbox Code Playgroud)

第二个代码的唯一区别是带有参数的构造函数的用法。


在两种情况下,预期的错误消息是:

  • g ++: no matching function for call to …

c++ static-assert

2
推荐指数
1
解决办法
85
查看次数

标签 统计

c++ ×2

c ×1

cmake ×1

dependency-management ×1

git ×1

static-assert ×1