undefined reference to 'void format<>(char const*)'

corelib/fmt.hpp

__attribute__((__visibility("default"))) std::string format(std::string _fmt,
                               Args... args);

corelib/fmt.cpp

static std::string _format(std::string _fmt,
                           std::string _out) {
  // TODO: Formatting
}

template <class T>
static std::string _format(std::string _fmt,
                           std::string _out,
                           T arg) {
  // TODO: Formatting
}

template <class T, class... Args>
static std::string _format(std::string _fmt,
                           std::string _out,
                           T arg,
                           Args... args) {
  // TODO: Formatting
}

template <class... Args>
std::string format(std::string _fmt,
                   Args... args) {
  return _format(_fmt, "", args...);
}

corelib/CMakeLists.txt

# Entry point
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/bin)
add_library(fagrcore SHARED)

# Source/Private headers
add_subdirectory(src)

# Public headers
target_include_directories(fagrcore PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include)

corelib/src/CMakeLists.txt

target_sources(fagrcore PRIVATE fmt.cpp)

prog/main.cpp

#include <core/fmt.hpp>

int main(int argc, char **argv) {
  std::cout << core::format("THAT'S WORKING\n");
}

prog/CMakeLists.txt

# Entry point
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/bin)
add_executable(prog)

# Source
add_subdirectory(src)

# Dependencies
target_link_libraries(prog PRIVATE corelib)

Без создания библиотеки (т.е просто добавив к prog исходники corelib) весь код работает на ура.

Полная ошибка

здесь немного другие пространства имен, и название функций.
Например println просто вызывает format и std::cout

/usr/bin/ld: CMakeFiles/fagreditor.dir/src/main.cpp.o: in function `main':
main.cpp:(.text+0x75): undefined reference to `void fagr::core::println<>(char const*)'
collect2: error: ld returned 1 exit status
make[2]: *** [editor/CMakeFiles/fagreditor.dir/build.make:100: ../bin/fagreditor] Error 1
make[1]: *** [CMakeFiles/Makefile2:414: editor/CMakeFiles/fagreditor.dir/all] Error 2
make: *** [Makefile:91: all] Error 2

Ответы (1 шт):

Автор решения: Dmitry Klementiev

Как я понял, единственное решение проблемы - вынести реализацию в заголовочный файл.

Как отметил @user7860607 в комментариях к вопросу есть std::format, странно что никто не отметил библиотеку fmt. Но здесь как раз таки суть в велосипедостроении, я принципиально не использовал два этих решения.

→ Ссылка