cmake:设置多个项目和它们之间的依赖关系

Bar*_*kPL 8 c++ cmake multiple-projects

我需要帮助为C++项目编写一个好的CMakeLists.txt.

我寻找答案,但我发现了什么.这是我的项目结构:

MainProj
|  ProjLib/
|  |  include/
|  |  |  proj_lib.h
|  |  src/
|  |  |  proj_lib.cc
|  |  CMakeLists.txt
|  ProjExec/
|  |  include/
|  |  |  proj_exec.h
|  |  src/
|  |  |  proj_exec.cc
|  |  CMakeLists.txt
|  CMakeLists.txt
Run Code Online (Sandbox Code Playgroud)

MainProj CMakeLists.txt

cmake_minimum_required(VERSION 2.8)
project(MainProj CXX)

# enable C and C++ language
enable_language(C CXX)

# Add sub-directories
add_subdirectory(ProjLib)
add_subdirectory(ProjExec)
Run Code Online (Sandbox Code Playgroud)

ProjLib CMakeLists.txt

set (PROJLIB_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/include)
set (PROJLIB_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/src)

set(PROJLIB_SRCS 
    ${CMAKE_CURRENT_SOURCE_DIR}/src/proj_lib.cc
)

include_directories("${PROJLIB_SOURCE_DIR}")
include_directories("${PROJLIB_INCLUDE_DIR}")

add_library(ProjLib SHARED ${PROJLIB_SRCS} ${PROJLIB_INCLUDE_DIR})

target_include_directories (ProjLib PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})
Run Code Online (Sandbox Code Playgroud)

ProjExec CMakeLists.txt

set (PROJEXEC_SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/src)
set (PROJEXEC_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/include)

set(PROJEXEC_SRCS 
    ${PROJEXEC_SOURCE_DIR}/proj_exec.cc
)

include_directories("${PROJEXEC_SOURCE_DIR}")
include_directories("${PROJEXEC_INCLUDE_DIR}")

add_executable(ProjExec ${PROJEXEC_SRCS})

target_link_libraries (ProjExec LINK_PUBLIC ProjLib)
Run Code Online (Sandbox Code Playgroud)

proj_exec.cc

#include "proj_lib.h"
...
Run Code Online (Sandbox Code Playgroud)

它在proj_exec.cc文件中找不到proj_lib.h.如果我在某些cmake中需要一些额外的条目?

任何帮助,将不胜感激.:)

rub*_*nvb 18

您需要使用CMake目标及其属性:

MainProj /的CMakeLists.txt:

cmake_minimum_required(VERSION 2.8)
project(MainProj)

# Add sub-directories
add_subdirectory(ProjLib)
add_subdirectory(ProjExec)
Run Code Online (Sandbox Code Playgroud)

ProjLib /的CMakeLists.txt

add_library(ProjLib SHARED src/proj_lib.cc)
target_include_directories(ProjLib PUBLIC ${CMAKE_CURRENT_LIST_DIR}/include)
Run Code Online (Sandbox Code Playgroud)

ProjExec /的CMakeLists.txt

add_executable(ProjExec src/proj_exec.cc)
target_include_directories(ProjExec PRIVATE ${CMAKE_CURRENT_LIST_DIR}/include)
target_link_libraries(ProjExec ProjLib)
Run Code Online (Sandbox Code Playgroud)

target_link_libraries 确保在构建目标时,其依赖项'PUBLIC和INTERFACE包含目录将被适当使用.

  • @Antonio:[target_include_directories`上的页面](https://cmake.org/cmake/help/v3.3/command/target_include_directories.html?highlight=target_include_directories)讨论了'PUBLIC`填充[INTERFACE_INCLUDE_DIRECTORIES`属性](https://cmake.org/cmake/help/v3.3/prop_tgt/INTERFACE_INCLUDE_DIRECTORIES.html#prop_tgt:INTERFACE_INCLUDE_DIRECTORIES),在调用`target_link_libraries`时使用:"当使用target_link_libraries()指定目标依赖项时, CMake将从所有目标依赖项中读取此属性,以确定使用者的构建属性." (2认同)