Я очень новичок в Cmake
и я пытаюсь использовать это как альтернативу этому подход, который не работал нормально.
Моя структура на самом деле проста, у меня есть:
App/src/
App/src/so1
App/src/so2
App/src/so3
И в каждом App/src/soN
папка, у меня есть .cpp
файл, который должен быть скомпилирован в общий объект.
Я знаю, что должен добавить CMakeLists.txt
файл в каждой папке, указанной выше, но я действительно потерян с библиотекой связи и включения.
Например, предположим, что под App/src/so1
:
App/src/so1/so1.hpp
App/src/so1/so1.cpp
И общий объект so1.so
требует -I /some/dir/include
, а также должен быть связан с -L /some/other/dir/lib -l otherdirlib
, Каковы соответствующие директивы, чтобы сделать это с помощью CMake
?
РЕДАКТИРОВАТЬ:
Используйте файл и GLOB_RECURSE:
GLOB_RECURSE сгенерирует список, аналогичный обычному GLOB, за исключением
он будет проходить по всем подкаталогам соответствующего каталога и
сопоставьте файлы.
Я советую вам переупорядочить ваши файлы следующим образом:
app/
|_ src/
|_ include/
|_ CMakeLists.txt
so1/
|_ src/
|_ include/
|_ CMakeLists.txt
so2/
|_ src/
|_ include/
|_ CMakeLists.txt
so3/
|_ src/
|_ include/
|_ CMakeLists.txt
CMakeLists.txt
CMakeLists.txt в папке приложения:
SET (APP_NAME app)
# Print variables to stdout
MESSAGE ( STATUS )
MESSAGE ( STATUS "Configuring ${APP_NAME}:" )
MESSAGE ( STATUS )
# Source code files
FILE (GLOB_RECURSE SOURCE_FILES src/*.cpp include/*.h include/*.inl)
# Compiler options
IF (CMAKE_COMPILER_IS_GNUCXX)
ADD_DEFINITIONS (-ansi -Wall -Wextra -Werror -pthread)
ENDIF ()
# Build application
ADD_EXECUTABLE (${APP_NAME} ${SOURCE_FILES})
TARGET_LINK_LIBRARIES (${APP_NAME}
${SO1_LIB}
${SO2_LIB}
${SO3_LIB}
)
INSTALL (TARGETS ${APP_NAME} RUNTIME DESTINATION bin PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_WRITE GROUP_EXECUTE WORLD_READ WORLD_EXECUTE)
Файл CMakeLists.txt в каждой папке lib будет выглядеть примерно так (измените LIB_OUTPUT_NAME в каждом файле соответственно):
SET (LIB_OUTPUT_NAME so1)
# Print variables to stdout
MESSAGE ( STATUS )
MESSAGE ( STATUS "Configuring ${LIB_OUTPUT_NAME}:" )
MESSAGE ( STATUS )
# Source code, headers and test files
FILE (GLOB_RECURSE HEADER_FILES include/*.h include/*.inl)
FILE (GLOB_RECURSE SOURCE_FILES src/*.cpp include/*.h include/*.inl)
FILE (GLOB_RECURSE TEST_SRC_FILES tests/*.cpp tests/*.h tests/*.inl)
# Compiler options
IF (CMAKE_COMPILER_IS_GNUCXX)
ADD_DEFINITIONS (-ansi -Wall -Wextra -Werror -pthread)
ENDIF ()
# Build library
ADD_LIBRARY (${LIB_OUTPUT_NAME} SHARED ${SOURCE_FILES})
Затем в основном CMakeLists.txt:
CMAKE_MINIMUM_REQUIRED (VERSION 2.6)
PROJECT (App CXX)
# Set common variables
IF ("${CMAKE_BUILD_TYPE}" STREQUAL "Release")
SET (BUILD_DIR build/release)
ELSE ()
SET (BUILD_DIR build/debug)
ENDIF ()
# Print variables to stdout
MESSAGE ( STATUS )
MESSAGE ( STATUS "Building App:" )
MESSAGE ( STATUS "change a configuration variable with: cmake -D<Variable>=<Value>" )
MESSAGE ( STATUS "CMAKE_INSTALL_PREFIX = ${CMAKE_INSTALL_PREFIX}" )
MESSAGE ( STATUS "CMAKE_BUILD_TYPE = ${CMAKE_BUILD_TYPE}" )
MESSAGE ( STATUS "CMAKE_PREFIX_PATH = ${CMAKE_PREFIX_PATH}" )
MESSAGE ( STATUS )
# Remove build directory on clean target
SET_DIRECTORY_PROPERTIES (PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES ${BUILD_DIR})
# Include directories
INCLUDE_DIRECTORIES (
"app/include""so1/include""so2/include""so3/include")
# Add common compiler flags
IF (CMAKE_COMPILER_IS_GNUCXX)
SET(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CPP_FLAGS_RELEASE} -O2")
SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -O0 -g)
ENDIF ()
# Build all dynamic Libraries
ADD_SUBDIRECTORY (smartmatic ${BUILD_DIR}/so1)
SET (SO1_LIB ${CMAKE_CURRENT_SOURCE_DIR}/${BUILD_DIR}/so1/so1.so)
ADD_SUBDIRECTORY (saes-runtime ${BUILD_DIR}/so2)
SET (SO2_LIB ${CMAKE_CURRENT_SOURCE_DIR}/${BUILD_DIR}/so2/so2.so)
ADD_SUBDIRECTORY (saes-devices ${BUILD_DIR}/so3)
SET (SO3_LIB ${CMAKE_CURRENT_SOURCE_DIR}/${BUILD_DIR}/so3/so3.so)
# Add dynamic lib to app build for linking.
ADD_SUBDIRECTORY (so1 ${BUILD_DIR}/so1)
SET (SO1_LIB ${CMAKE_CURRENT_SOURCE_DIR}/${BUILD_DIR}/so1/so1.so)
ADD_SUBDIRECTORY (so2 ${BUILD_DIR}/so2)
SET (SO2_LIB ${CMAKE_CURRENT_SOURCE_DIR}/${BUILD_DIR}/so2/so2.so)
ADD_SUBDIRECTORY (so3 ${BUILD_DIR}/so3)
SET (SO3_LIB ${CMAKE_CURRENT_SOURCE_DIR}/${BUILD_DIR}/so3/so3.so)
# Build Application
ADD_SUBDIRECTORY (app ${CMAKE_CURRENT_SOURCE_DIR}/${BUILD_DIR}/app)
Больше информации о:
Других решений пока нет …