【发布时间】:2017-12-02 00:19:53
【问题描述】:
我正在尝试创建一个合理的库结构和 CMake 文件,以允许其他 CMake 项目轻松包含此库。我发现了很多类似的问题,但是,它们似乎都没有解决我的确切问题。
我目前的结构如下:
/*MyLibrary/
├── CMakeLists.txt (including lib subdirectories)
├── external/
│ └── googletest/
├── lib/
│ ├── common/
│ │ ├── CMakeList.txt (creates static lib common)
│ │ ├── include/common/*.h
│ │ └── src/*.cpp
│ ├── cipher/
│ │ ├── CMakeList.txt (creates static lib cipher)
│ │ ├── include/cipher/*.h
│ │ └── src/*.cpp
└── test/
├── main.cpp (code for executing google test)
├── CMakeLists.txt (creates unittest executable)
├── common/*Test.cpp
└── cipher/*Test.cpp
*/
现在我想创建一个具有类似目录结构的项目,但是当我想在该项目中创建一个与MyLibrary 中的静态库之一同名的静态库时出现问题(例如common )。
我正在考虑在项目 CMakeLists 中使用 add_subdirectory(external/MyLibrary) 将库包含到项目中,但由于静态库的名称冲突,因此失败了。
即使我通过重命名库来解决这个问题(我实际上并不认为这是一个优雅的解决方案),我最终还是会遇到 googletest 冲突,因为库和我的项目都依赖于 googletest。
有什么方法可以轻松解决这个问题吗?我在想两种可能性:
在
MyLibrary中,我将从所有名为libMyLibrary.a的子库中创建一个静态库,并且只包含该库(首选选项,但我不知道如何在 CMake 中实现它)强制库的用户安装它,并且不要将库作为项目子模块包含(我会选择的最后一个选项)
是否有其他合理的方法来解决它,使我的库与大多数 CMake 项目兼容?如果没有,我怎样才能至少实现上述选项之一?
简而言之:如何为库创建 CMake 文件,以便该库易于包含在其他 CMake 项目中?
如何处理 googletest 等冗余依赖项?
【问题讨论】:
-
对于您的单个静态库选项,这将起作用:cmake.org/Wiki/CMake/Tutorials/Object_Library 我不确定它是否是最佳选择,但我已经做到了。不过,我不确定为什么您的两个依赖于 googletest 的库应该是个问题。
-
我已经读了好几遍你的问题,但我还是不太明白你的问题是什么。请澄清。
-
@zzxyz,谢谢,我会调查的。
-
@RCYR 我已经重新表述了我的问题,现在清楚了吗?
标签: c++ cmake static-libraries