Home > Back-end >  CMake creating libraries that depend each other
CMake creating libraries that depend each other

Time:07-11

my goal is to create libraries like client and generator and use them in src/main.cpp, but sometimes these libraries depend each other.

In this case: client/User.hpp uses generator/IdGenerator.hpp

Project
│
├── CMakeLists.txt
├── libs
│   ├── CMakeLists.txt
│   ├── client
│   │   ├── CMakeLists.txt
│   │   ├── User.cpp
│   │   └── User.hpp
│   └── generator
│       ├── CMakeLists.txt
│       ├── IdGenerator.cpp
│       ├── IdGenerator.hpp
│       └── Types.hpp
└── src
    └── main.cpp

Project/CMakeLists.txt:

cmake_minimum_required (VERSION 3.8)

project(game-project VERSION 0.1.0)

set (CMAKE_CXX_STANDARD 20)
set (CMAKE_CXX_FLAGS "-Wall -Wextra -O0 -std=c  20")

add_executable (game src/main.cpp)

add_subdirectory(libs)

target_link_libraries(game libclient libgenerator)

libs/CMakeLists.txt:

add_subdirectory(generator)
add_subdirectory(client)

libs/client/CMakeLists.txt:

add_library(libclient STATIC
    User.cpp
    User.hpp
)

include_directories(generator/)
target_link_libraries(libclient libgenerator)

libs/generator/CMakeLists.txt:

add_library(libgenerator STATIC
    IdGenerator.cpp
    IdGenerator.hpp
    Types.hpp
)

C files:

main.cpp:

#include <client/User.hpp>

int main(int argc, const char* argv[])
{
    User user;
    return 0;
}

client/User.hpp:

#pragma once

#include <generator/IdGenerator.hpp>

class User
{
    Identifier id = IdGenerator::generateId();
};

When I run make after cmake, I get this error:

In file included from Project/libs/client/User.cpp:1:
Project/libs/client/User.hpp:3:10: fatal error: generator/IdGenerator.hpp: No such file or directory
    3 | #include <generator/IdGenerator.hpp>
      |          ^~~~~~~~~~~~~~~~~~~~~~~~~~~
compilation terminated.

Sorry for the verbose summary, I was able to shorten the example this much. What do you think the problem is?

This question might seem like a duplicate of CMake libraries that depend on each other but as you can see I'm already applying the include_directories(generator/).

CodePudding user response:

I misunderstood what the problem was initially, but now I think this might help. Try adding to the CMakeLists.txt of your client instead of

include_directories(generator/)

this command

target_include_directories(libclient PUBLIC <Path to your generator file>)

Maybe you need to experiment a little to get the path correct as you might need to either specify it from the root directory or the current one (where this CMakeLists.txt resides), but it might solve your problem.

  • Related