I have a large project with three main dependencies: drogon, swredis and hiredis. All three dependencies are shared libraries.
Project itself contains multiple static libs (tools, models, schemas, services, etc.) linking together with cmake
I want to connect Sentry and it needs debug symbols for it to work. This is where the weird stuff starts:
- When building cmake .. -DCMAKE_BUILD_TYPE:STRING=Release, the final size is 27.8 MB
- When building cmake .. -DCMAKE_BUILD_TYPE:STRING=Debug(without optimizations), the size is 313.4 MB
- When building cmake .. -DCMAKE_BUILD_TYPE:STRING=RelWithDebInfothe size is 484.2 megabytes
I don’t understand how this is possible? Why is the size of RelWithDebInfo larger than simple Debug? I guess I made a mistake somewhere in CMakeLists.txt itself and it somehow adds all dependencies to debug symbols? Or is this normal? Searching forums didn’t give me any results, everyone says that such a situation is impossible (but here it is).
I would like to keep the size of the application as small as possible to save space on Sentry.
Here is my main CMakeLists.txt
cmake_minimum_required(VERSION 3.20)  # Ensure CMake version supports CMP0079
set(CMAKE_POLICY_DEFAULT_CMP0079 NEW) # Prefer shared libraries over static
project(app CXX)
message(STATUS "Build type: ${CMAKE_BUILD_TYPE}")
include(CheckIncludeFileCXX)
check_include_file_cxx(any HAS_ANY)
check_include_file_cxx(string_view HAS_STRING_VIEW)
check_include_file_cxx(coroutine HAS_COROUTINE)
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
set(CMAKE_STATIC_LIBRARY_PREFIX "")
###########################################################################
find_package(Drogon CONFIG REQUIRED SHARED)
link_libraries(Drogon::Drogon)
find_package(Sentry REQUIRED SHARED)
add_executable(${PROJECT_NAME} main.cc)
###########################################################################
add_subdirectory(libs)
add_subdirectory(models)
add_subdirectory(src)
target_link_libraries(${PROJECT_NAME}
    PRIVATE
    models
    schemas
    services
    states
    tools
    sentry
)
My CMakeLists.txt for tools (contains hiredis and swredis):
add_library(tools)
target_sources(tools
    PRIVATE
    ... (all cpp files)
)
######################################
find_path(HIREDIS_HEADER hiredis)
include_directories(${HIREDIS_HEADER})
find_library(HIREDIS_LIB hiredis SHARED)
find_path(REDIS_PLUS_PLUS_HEADER sw)
include_directories(${REDIS_PLUS_PLUS_HEADER})
find_library(REDIS_PLUS_PLUS_LIB redis++ SHARED)
find_package(OpenSSL REQUIRED)
target_link_libraries(tools
    PUBLIC
    ${HIREDIS_LIB}
    ${REDIS_PLUS_PLUS_LIB}
    OpenSSL::Crypto
    OpenSSL::SSL
    PRIVATE
    models
    sha256
    base64
)
target_include_directories(tools
    PUBLIC
    ${CMAKE_CURRENT_LIST_DIR}/../../include
    PRIVATE
    ${PROJECT_SOURCE_DIR}/libs
    ${CMAKE_CURRENT_LIST_DIR}/../../include/tools
    ${CMAKE_CURRENT_LIST_DIR}/../../include/tools/parsers
    ${CMAKE_CURRENT_LIST_DIR}/private
)
I would be very happy if you could help me. I am not an expert in CMake and it is difficult for me to understand some features of the work.
The ideal situation is that I can take all dependencies separately (since they do not change) and update only app . I still can’t figure out whether debug symbols for dynamic libraries (drogon, redis) are added to app or not.