diff --git a/CMakeLists.txt b/CMakeLists.txt
index 8cc25bd..5df5f4d 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -73,6 +73,11 @@ if (NOT HAVE_LINUX_HEADERS)
message(FATAL_ERROR "You are missing some Linux headers required to compile heaptrack.")
endif()
+# cfree() does not exist in glibc 2.26+.
+# See: https://bugs.kde.org/show_bug.cgi?id=383889
+include(CheckSymbolExists)
+check_symbol_exists(cfree malloc.h HAVE_CFREE)
+
set(BIN_INSTALL_DIR "bin")
set(LIB_SUFFIX "" CACHE STRING "Define suffix of directory name (32/64)")
set(LIB_INSTALL_DIR "lib${LIB_SUFFIX}")
diff --git a/src/track/heaptrack_inject.cpp b/src/track/heaptrack_inject.cpp
index 0bf75f8..2956613 100644
--- a/src/track/heaptrack_inject.cpp
+++ b/src/track/heaptrack_inject.cpp
@@ -18,6 +18,7 @@
*/
#include "libheaptrack.h"
+#include "util/config.h"
#include <cstdlib>
#include <cstring>
@@ -43,12 +44,6 @@
#error unsupported word size
#endif
-#if defined(_BSD_SOURCE) || defined(_SVID_SOURCE) || defined(__USE_MISC)
-#define HAVE_CFREE 1
-#else
-#define HAVE_CFREE 0
-#endif
-
namespace {
namespace Elf {
diff --git a/src/track/heaptrack_preload.cpp b/src/track/heaptrack_preload.cpp
index b106bcd..343b193 100644
--- a/src/track/heaptrack_preload.cpp
+++ b/src/track/heaptrack_preload.cpp
@@ -18,6 +18,7 @@
*/
#include "libheaptrack.h"
+#include "util/config.h"
#include <cstdio>
#include <cstdlib>
@@ -30,7 +31,6 @@
using namespace std;
#define HAVE_ALIGNED_ALLOC defined(_ISOC11_SOURCE)
-#define HAVE_CFREE (defined(_BSD_SOURCE) || defined(_SVID_SOURCE) || defined(__USE_MISC))
namespace {
diff --git a/src/util/config.h.cmake b/src/util/config.h.cmake
index d24034a..8239ae3 100644
--- a/src/util/config.h.cmake
+++ b/src/util/config.h.cmake
@@ -30,4 +30,8 @@
#define HEAPTRACK_DEBUG_BUILD @HEAPTRACK_DEBUG_BUILD@
+// cfree() does not exist in glibc 2.26+.
+// See: https://bugs.kde.org/show_bug.cgi?id=383889
+#cmakedefine01 HAVE_CFREE
+
#endif // HEAPTRACK_CONFIG_H
diff --git a/tests/manual/CMakeLists.txt b/tests/manual/CMakeLists.txt
index 63f9526..4bbbbb6 100644
--- a/tests/manual/CMakeLists.txt
+++ b/tests/manual/CMakeLists.txt
@@ -2,6 +2,10 @@ set(CMAKE_BUILD_TYPE Debug)
add_executable(test_c test.c)
add_executable(test_cpp test.cpp)
+set_target_properties(test_cpp PROPERTIES
+ INCLUDE_DIRECTORIES ${CMAKE_CURRENT_BINARY_DIR}/../../src/
+)
+
add_executable(threaded threaded.cpp)
target_link_libraries(threaded ${CMAKE_THREAD_LIBS_INIT})
diff --git a/tests/manual/test.cpp b/tests/manual/test.cpp
index e3f1870..1e9c267 100644
--- a/tests/manual/test.cpp
+++ b/tests/manual/test.cpp
@@ -1,6 +1,8 @@
#include <cstdio>
#include <cstdlib>
+#include "util/config.h"
+
#define HAVE_ALIGNED_ALLOC defined(_ISOC11_SOURCE)
struct Foo
@@ -60,7 +62,11 @@ int main()
buf = calloc(5, 5);
printf("calloc: %p\n", buf);
+#if HAVE_CFREE
cfree(buf);
+#else
+ free(buf);
+#endif
#if HAVE_ALIGNED_ALLOC
buf = aligned_alloc(16, 160);