我一直在搜索很多东西,但是我似乎找不到关于如何使CMAKE C ++项目高度模块化的良好且一致的信息。
有关项目的信息:
- 创建可执行文件(不是库)的C ++ CMAKE项目。
- 我希望项目的各个部分都是库,以便它们可以被其他项目潜在地使用。
- 比方说,这个项目取决于3个库。我们称它们为 TheLib , SubLib1 , SubLib2 。我希望SubLib1和SubLib2是独立的,这意味着有人可以单独使用它们。但是TheLib依赖于两个子库。我还要注意,这3个库是我开发的,但我想允许任何人(或future-me)选择这3个库中的任何一个并将它们包含在另一个项目中。
- 我希望将这3个库包含在项目中,并且 not 不能在其他地方找到。
- 该项目还依赖于第三方库,我们称它为 ExtLib 。我还希望该库包含在项目中,并且不要在其他地方找到。
- 不同的库应具有自己的CMakeLists.txt
我想做什么:
找到传达项目架构的项目结构。
如果我不得不猜测的话,会是什么样?
project_root/
-CMakeLists.txt (the main cmake file)
-thirdparty/
---ExtLib/ (contains include/, src/, CMakeLists.txt)
-src/
---Main.cpp
---depends/
-----TheLib/
-------CMakeLists.txt (cmake file for TheLib)
-------include/
---------TheLib/
-----------TheLib.h
-------src/
---------TheLib.cpp
---------depends/
-----------SubLib1/ (contains include/, src/, CMakeLists.txt)
-----------SubLib2/ (contains include/, src/, CMakeLists.txt)
问题:(我知道他们很多,对他们中的任何帮助都将不胜感激)
- 您如何看待整体结构?
- 这些库的代码是否应该位于根目录的src目录之外?
- 我已经看到一些在src内(而不是在程序/库的根目录下)具有CMakeLists.txt的项目。有区别吗?
- 我看过一些项目,这些项目的库都有非常简单的CMakeLists.txt文件。那应该是这样吗?假设SubLib1依赖于ReallyExtLib,它应该不包含在代码中,而是位于/ opt / local / include或类似的内容中。 SubLib1的CMakeLists.txt是否应该具有find_package(ReallyExtLib)等? (我假设没有,只是将其包含在项目的根CMakeLists.txt中)
- 不包括第三方依赖项,您是否有任何示例了解项目,TheLib,SubLibX的CMakeLists.txt看起来如何?我发现了this link,但这似乎是关于建立一个不是可执行文件的库。
谢谢。