CMake:使用相同静态库的多个子项目

问题描述 投票:0回答:2

我正在使用 cmake 编译我的一个工作项目,这是交易

-
  client/
    CMakeLists.txt
  server/
    CMakeLists.txt
  libs/
    libstuff/
      CMakeLists.txt
  CMakeLists.txt

所以我希望能够单独编译每个子项目,并从根文件夹构建客户端和服务器。

假设客户端和服务器需要 libstuff。

我尝试将“add_subdirectory”与客户端和服务器 CMakeLists.txt 中的 lib 路径一起使用,它在编译服务器或客户端时有效,但如果您尝试从根目录运行两者:

CMake Error at common/libplugin/CMakeLists.txt:33 (ADD_LIBRARY):
  add_library cannot create target "plugin" because another target with the
  same name already exists.  The existing target is a static library created
  in source directory "/home/adrien/git/r-type/common/libplugin".  See
  documentation for policy CMP0002 for more details.

所以我是 cmake 的新手,我不确定我应该做什么,我应该使用 add_dependency 吗?

感谢您的帮助,

static cmake
2个回答
45
投票

一个简单的解决方案是使用

TARGET
条件来保护客户端和服务器 CMake 列表文件中的
add_subdirectory
调用,即: if

这可以防止多次添加 
if (NOT TARGET plugin) add_subdirectory("${CMAKE_SOURCE_DIR}/common/libplugin") endif()

子目录。

    


6
投票

像独立项目一样设置 Stuff 项目,但将变量添加到 cmake 缓存,以便其他项目可以“导入”它。然后,在客户端和服务器中,您可以使用普通调用

include_directories

target_link_libraries 来引用 Stuff 项目...。 例如在 libstuff 中...

libplugin

然后在客户端(在服务器中类似)

# libstuff CMakeLists project( Stuff ) # ... whatever you need here: collect source files, ... add_library( LibStuff ${Stuff_Sources} ) # Then, define a very useful variables which gets exported to the cmakecache and can be # used by other cmakelists set( STUFF_INCLUDE_DIRS ${Stuff_SOURCE_DIR} CACHE STRING "Include-dir for Stuff." FORCE )

然后,您可以通过单步进入 Client 目录并在那里运行 make 或 msbuild 来“编译” Client 目录。或者,您可以向 root-cmakelistt 添加一个 cmake-flag,用于在客户端、服务器或两者之间进行过滤...

© www.soinside.com 2019 - 2024. All rights reserved.