创建C ++与CMake的库(Creating C++ library with CMake)

2019-10-29 22:06发布

我想创建一个合理的库结构和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
*/

现在我想创建一个类似的目录结构的一个项目,但是当我想在具有相同的名称作为静态库的一个项目,以创建一个静态库出现问题MyLibrarycommon的例子)。
我想包括图书馆到使用项目的add_subdirectory(external/MyLibrary)在项目CMakeLists,但失败,因为静态库的名称colide。
甚至当我解决这个问题,通过重命名库(我其实不认为这是一个很好的解决方案),我结束了googletest冲突,因为两者的图书馆和我的项目,都依赖于googletest。

有什么办法可以轻松地解决这个问题? 我想的是2个posibilities:

  • MyLibrary我就从所谓的所有子库创建一个静态库libMyLibrary.a并且仅包括图书馆(优先停留的选择,但我没有线索如何实现它的CMake)
  • 强制库的用户安装它,不包括图书馆作为一个项目子模块(最后一个选项我会去的)

有没有解决呢这将使我的图书馆与大多数CMake的项目兼容其他一些合理的方式? 如果没有,我怎么能实现上面提到的选项中至少有一个

简而言之:
我怎样才能创建一个图书馆的CMake文件,使图书馆很容易包含在其他CMake的项目?
我该如何处理多余的相关性,如googletest?

Answer 1:

我怎样才能创建一个图书馆的CMake文件,使图书馆很容易包含在其他CMake的项目?

没有为这个目的没有通用的方法。

通过包括项目到另一个与add_subdirectory()你“打开”项目到另一个的内部。 除了优势在具有图书馆的目标准备链接,这种做法有不利的地方。 Target的碰撞,缓存变量的碰撞将是你的头痛,与一些其他问题。

如果你希望你的项目被纳入其他与add_subdirectory ,避免使用你的目标“通用”的名字。 例如,可以使用<my_project_name>_common代替common

有些目标不能重命名(如gtest )。 如果这些目标是不是真的需要为您的项目工作,创造一个选项禁用它们:

option(<my_project_name>_TESTING "Enable testing" ON)
if(<my_project_name>_TESTING)
    add_subdirectory(external/googletest)
endif()

另见我的回答对减排目标的名字碰撞类似的问题。



文章来源: Creating C++ library with CMake