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. Но здесь как раз таки суть в велосипедостроении, я принципиально не использовал два этих решения.