У меня есть проект C ++ со следующей структурой:
CMakeLists.txt
code/
libClient/
CMakeLists.txt
include/
LibClient/
lib_client.h
src/
lib_client.cpp
libServer/
CMakeLists.txt
include/
LibServer/
lib_server.h
src/
lib_server.cpp
libSDK/
include/
CMakeLists.txt
LibSDK/
lib.h
Мой корневой файл CMakeLists.txt имеет следующее содержимое:
cmake_minimum_required(VERSION 3.0)
project(libExample)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
add_subdirectory(code/libClient)
add_subdirectory(code/libServer)
add_subdirectory(code/libSDK)
Теперь я хотел бы собрать библиотекидля сервера и для клиента в виде .a
файлов. lib_client.cpp
включает в себя заголовочные файлы с
#include <LibClient/lib_client.h>
До этого мне все ясно, но заголовочный файл lib_client.h
включает в себя lib.h
, который находитсяна /code/libSDK/include/LibSDK/lib.h
с
#ifndef LIBCLIENT_H
#define LIBCLIENT_H
#include <string>
#include <LibSDK/lib.h>
Чтобы сделать эту работу, я написал следующее содержимое в CMakelists.txt для ClientLib:
project(LIBCLIENT)
add_library(
Client_lib STATIC
src/lib_client.cpp
include/LibClient/lib_client.h
)
target_include_directories(egoClient_lib PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/include")
target_include_directories(egoClient_lib PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/../libSDK/include") ###this line I think should be different.
Мой вопрос сейчас, возможно ли эточтобы избежать этой линии с жестко закодированным путем? Это lib.h
также используется (включено) в других заголовочных файлах в этом проекте.
CMakelists.txt для этого lib.h до сих пор имеет только содержимое:
cmake_minimum_required(VERSION 3.0)
project(LIBSDK)
Я думал об использовании метода CMake find_package()
и записи файла Find<package>.cmake
,но я не вижу никаких преимуществ в этом, потому что внутри этого файла я также должен написать пути?
Заранее большое спасибо.