diff --git a/CMakeLists.txt b/CMakeLists.txt
index 4c573207..ab376c3e 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -135,9 +135,10 @@ endif()
 bison_target(bison_parser src/parser.yy ${CMAKE_BINARY_DIR}/parser.tab.cc COMPILE_FLAGS ${BISON_FLAGS} VERBOSE)
 flex_target(flex_lexer src/lexer.l ${CMAKE_BINARY_DIR}/lex.yy.cc)
 add_flex_bison_dependency(flex_lexer bison_parser)
-add_library(parser ${BISON_bison_parser_OUTPUTS} ${FLEX_flex_lexer_OUTPUTS})
-target_compile_options(parser PRIVATE "-w")
-target_include_directories(parser PUBLIC src src/ast ${CMAKE_BINARY_DIR})
+add_library(bpftraceparser ${BISON_bison_parser_OUTPUTS} ${FLEX_flex_lexer_OUTPUTS})
+target_compile_options(bpftraceparser PRIVATE "-w")
+target_include_directories(bpftraceparser PUBLIC src src/ast ${CMAKE_BINARY_DIR})
+install(TARGETS bpftraceparser LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR})
 
 include(CheckSymbolExists)
 set(CMAKE_REQUIRED_DEFINITIONS -D_GNU_SOURCE)
diff --git a/resources/CMakeLists.txt b/resources/CMakeLists.txt
index a95c60a1..f5c4d676 100644
--- a/resources/CMakeLists.txt
+++ b/resources/CMakeLists.txt
@@ -1,6 +1,7 @@
-add_library(resources headers.cpp)
+add_library(bpftraceresources headers.cpp)
 
-target_include_directories(resources PUBLIC ../src)
+target_include_directories(bpftraceresources PUBLIC ../src)
+install(TARGETS bpftraceresources LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR})
 
 function(embed_headers output)
   file(WRITE ${output} "#include \"headers.h\"\n\nnamespace bpftrace {\n")
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 708c8bf3..7be92f63 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -13,7 +13,7 @@ else()
   endif ()
 endif()
 
-add_library(runtime
+add_library(bpftraceruntime
   attached_probe.cpp
   bpffeature.cpp
   bpftrace.cpp
@@ -44,7 +44,7 @@ add_library(runtime
   ${BFD_DISASM_SRC}
 )
 # Ensure flex+bison outputs are built first
-add_dependencies(runtime parser)
+add_dependencies(bpftraceruntime bpftraceparser)
 
 add_library(libbpftrace
   build_info.cpp
@@ -61,6 +61,7 @@ add_executable(${BPFTRACE}
 )
 
 install(TARGETS ${BPFTRACE} DESTINATION ${CMAKE_INSTALL_BINDIR})
+install(TARGETS libbpftrace LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR})
 target_link_libraries(${BPFTRACE} libbpftrace)
 
 if (BUILD_FUZZ)
@@ -89,7 +90,7 @@ endif()
 set(KERNEL_HEADERS_DIR "" CACHE PATH "Hard-code kernel headers directory")
 if (KERNEL_HEADERS_DIR)
   MESSAGE(STATUS "Using KERNEL_HEADERS_DIR=${KERNEL_HEADERS_DIR}")
-  target_compile_definitions(runtime PUBLIC KERNEL_HEADERS_DIR="${KERNEL_HEADERS_DIR}")
+  target_compile_definitions(bpftraceruntime PUBLIC KERNEL_HEADERS_DIR="${KERNEL_HEADERS_DIR}")
 endif()
 
 execute_process(
@@ -109,10 +110,11 @@ endif()
 
 add_definitions("-DBPFTRACE_VERSION=\"${BPFTRACE_VERSION}\"")
 
-target_include_directories(runtime PRIVATE ${CMAKE_BINARY_DIR})
-target_include_directories(runtime PRIVATE ${CMAKE_SOURCE_DIR}/src)
-target_include_directories(runtime PRIVATE ${CMAKE_SOURCE_DIR}/src/ast)
-target_compile_definitions(runtime PRIVATE ${BPFTRACE_FLAGS})
+target_include_directories(bpftraceruntime PRIVATE ${CMAKE_BINARY_DIR})
+target_include_directories(bpftraceruntime PRIVATE ${CMAKE_SOURCE_DIR}/src)
+target_include_directories(bpftraceruntime PRIVATE ${CMAKE_SOURCE_DIR}/src/ast)
+target_compile_definitions(bpftraceruntime PRIVATE ${BPFTRACE_FLAGS})
+install(TARGETS bpftraceruntime LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR})
 target_compile_definitions(libbpftrace PRIVATE ${BPFTRACE_FLAGS})
 
 # Linking
@@ -125,8 +127,8 @@ if(STATIC_LINKING)
 endif(STATIC_LINKING)
 
 
-target_link_libraries(runtime ${LIBBPF_LIBRARIES})
-target_link_libraries(libbpftrace parser resources runtime aot ast arch cxxdemangler_llvm)
+target_link_libraries(bpftraceruntime ${LIBBPF_LIBRARIES})
+target_link_libraries(libbpftrace bpftraceparser bpftraceresources bpftraceruntime aot bpftraceast bpftracearch cxxdemangler_llvm)
 
 if(LIBPCAP_FOUND)
   target_link_libraries(libbpftrace ${LIBPCAP_LIBRARIES})
@@ -136,37 +138,38 @@ if(HAVE_BFD_DISASM)
   if(STATIC_LINKING)
     add_library(LIBBFD STATIC IMPORTED)
     set_property(TARGET LIBBFD PROPERTY IMPORTED_LOCATION ${LIBBFD_LIBRARIES})
-    target_link_libraries(runtime LIBBFD)
+    target_link_libraries(bpftraceruntime LIBBFD)
     add_library(LIBOPCODES STATIC IMPORTED)
     set_property(TARGET LIBOPCODES PROPERTY IMPORTED_LOCATION ${LIBOPCODES_LIBRARIES})
-    target_link_libraries(runtime LIBOPCODES)
+    target_link_libraries(bpftraceruntime LIBOPCODES)
     add_library(LIBIBERTY STATIC IMPORTED)
     set_property(TARGET LIBIBERTY PROPERTY IMPORTED_LOCATION ${LIBIBERTY_LIBRARIES})
-    target_link_libraries(runtime LIBIBERTY)
+    target_link_libraries(bpftraceruntime LIBIBERTY)
   else()
-    target_link_libraries(runtime ${LIBBFD_LIBRARIES})
-    target_link_libraries(runtime ${LIBOPCODES_LIBRARIES})
+    target_link_libraries(bpftraceruntime ${LIBBFD_LIBRARIES})
+    target_link_libraries(bpftraceruntime ${LIBOPCODES_LIBRARIES})
   endif(STATIC_LINKING)
 endif(HAVE_BFD_DISASM)
 
 # Link to bcc libraries (without LLVM) if possible
 if(LIBBCC_BPF_CONTAINS_RUNTIME)
-  target_link_libraries(runtime ${LIBBCC_BPF_LIBRARIES})
+  target_link_libraries(bpftraceruntime ${LIBBCC_BPF_LIBRARIES})
 else()
-  target_link_libraries(runtime ${LIBBCC_LIBRARIES})
+  target_link_libraries(bpftraceruntime ${LIBBCC_LIBRARIES})
 endif()
 
 if(STATIC_BPF_BCC)
   # These are not part of the static libbcc so have to be added separate
-  target_link_libraries(runtime ${LIBBCC_BPF_LIBRARIES})
-  target_link_libraries(runtime ${LIBBPF_LIBRARIES})
-  target_link_libraries(runtime ${LIBBCC_LOADER_LIBRARY_STATIC})
+  target_link_libraries(bpftraceruntime ${LIBBCC_BPF_LIBRARIES})
+  target_link_libraries(bpftraceruntime ${LIBBPF_LIBRARIES})
+  target_link_libraries(bpftraceruntime ${LIBBCC_LOADER_LIBRARY_STATIC})
 
   add_library(LIBELF STATIC IMPORTED)
   set_property(TARGET LIBELF PROPERTY IMPORTED_LOCATION ${LIBELF_LIBRARIES})
-  target_link_libraries(runtime LIBELF)
+  set_property(TARGET LIBELF PROPERTY IMPORTED_LOCATION ${LIBBPF_LIBRARIES})
+  target_link_libraries(bpftraceruntime LIBELF)
 else()
-  target_link_libraries(runtime ${LIBELF_LIBRARIES})
+  target_link_libraries(bpftraceruntime ${LIBELF_LIBRARIES})
 endif(STATIC_BPF_BCC)
 
 if (LIBDW_FOUND)
@@ -195,16 +198,16 @@ if (LIBDW_FOUND)
 
     target_link_libraries(LIBDW INTERFACE ${LIBDW_LIBS})
 
-    target_link_libraries(runtime LIBDW)
+    target_link_libraries(bpftraceruntime LIBDW)
   else()
-    target_link_libraries(runtime ${LIBDW_LIBRARIES})
+    target_link_libraries(bpftraceruntime ${LIBDW_LIBRARIES})
   endif()
 endif()
 
 # Support for std::filesystem
 # GCC version <9 and Clang (all versions) require -lstdc++fs
 if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang" OR ${CMAKE_CXX_COMPILER_VERSION} VERSION_LESS "9")
-  target_link_libraries(runtime "stdc++fs")
+  target_link_libraries(bpftraceruntime "stdc++fs")
   target_link_libraries(libbpftrace "stdc++fs")
 endif()
 
@@ -226,16 +229,16 @@ endif()
 if (STATIC_LINKING)
   if(ANDROID)
     target_link_libraries(libbpftrace "-Wl,-Bdynamic" "-ldl" "-lm" "-lz")
-    target_link_libraries(runtime "-Wl,-Bdynamic" "-ldl" "-lm" "-lz")
+    target_link_libraries(bpftraceruntime "-Wl,-Bdynamic" "-ldl" "-lm" "-lz")
   else()
     target_link_libraries(libbpftrace "-Wl,-Bdynamic" "-lrt" "-lpthread" "-ldl" "-lm")
     target_link_libraries(libbpftrace "-Wl,-Bstatic" "-lz")
-    target_link_libraries(runtime "-Wl,-Bdynamic" "-lrt" "-lpthread" "-ldl" "-lm")
-    target_link_libraries(runtime "-Wl,-Bstatic" "-lz")
+    target_link_libraries(bpftraceruntime "-Wl,-Bdynamic" "-lrt" "-lpthread" "-ldl" "-lm")
+    target_link_libraries(bpftraceruntime "-Wl,-Bstatic" "-lz")
   endif()
 elseif(STATIC_BPF_BCC)
   # partial static build, libbpf needs zlib, bcc needs liblzma
-  target_link_libraries(runtime "-lz" "-llzma")
+  target_link_libraries(bpftraceruntime "-lz" "-llzma")
 endif()
 
 unset(MAIN_SRC)
diff --git a/src/aot/CMakeLists.txt b/src/aot/CMakeLists.txt
index c776d204..41e84317 100644
--- a/src/aot/CMakeLists.txt
+++ b/src/aot/CMakeLists.txt
@@ -1,8 +1,9 @@
 add_library(aot aot.cpp)
-add_dependencies(aot parser)
+add_dependencies(aot bpftraceparser)
 target_include_directories(aot PUBLIC ${CMAKE_SOURCE_DIR}/src)
 target_include_directories(aot PUBLIC ${CMAKE_BINARY_DIR})
 target_compile_definitions(aot PRIVATE ${BPFTRACE_FLAGS})
+install(TARGETS aot LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR})
 
 # Only build aotrt if supported bcc is used
 # (https://github.com/iovisor/bcc/commit/719191867a25ce07dc96f7faf9b8ccedadc7ec44)
@@ -11,7 +12,7 @@ if(NOT LIBBCC_BPF_CONTAINS_RUNTIME)
 endif()
 
 add_executable(bpftrace-aotrt aot_main.cpp)
-target_link_libraries(bpftrace-aotrt aot runtime arch ast_defs cxxdemangler_stdlib)
+target_link_libraries(bpftrace-aotrt aot bpftraceruntime bpftracearch ast_defs cxxdemangler_stdlib)
 install(TARGETS bpftrace-aotrt DESTINATION ${CMAKE_INSTALL_BINDIR})
 
 if(LIBPCAP_FOUND)
diff --git a/src/arch/CMakeLists.txt b/src/arch/CMakeLists.txt
index d01d1ea3..82bfeccc 100644
--- a/src/arch/CMakeLists.txt
+++ b/src/arch/CMakeLists.txt
@@ -1,21 +1,23 @@
 if(CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64")
-    add_library(arch aarch64.cpp)
+    add_library(bpftracearch aarch64.cpp)
 elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "armv7-a")
-    add_library(arch arm.cpp)
+    add_library(bpftracearch arm.cpp)
 elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "ppc64" OR
        CMAKE_SYSTEM_PROCESSOR STREQUAL "ppc64le")
-    add_library(arch ppc64.cpp)
+    add_library(bpftracearch ppc64.cpp)
 elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "s390" OR
        CMAKE_SYSTEM_PROCESSOR STREQUAL "s390x")
-    add_library(arch s390.cpp)
+    add_library(bpftracearch s390.cpp)
 elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64")
-    add_library(arch x86_64.cpp)
+    add_library(bpftracearch x86_64.cpp)
 elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "mips64")
-    add_library(arch mips64.cpp)
+    add_library(bpftracearch mips64.cpp)
 elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "riscv64")
-    add_library(arch riscv64.cpp)
+    add_library(bpftracearch riscv64.cpp)
 elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "loongarch64")
-    add_library(arch loongarch64.cpp)
+    add_library(bpftracearch loongarch64.cpp)
 else()
   message(FATAL_ERROR "Unsupported architecture: ${CMAKE_SYSTEM_PROCESSOR}")
 endif()
+
+install(TARGETS bpftracearch LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR})
diff --git a/src/ast/CMakeLists.txt b/src/ast/CMakeLists.txt
index c390ea6a..37019bd9 100644
--- a/src/ast/CMakeLists.txt
+++ b/src/ast/CMakeLists.txt
@@ -1,6 +1,6 @@
 add_library(ast_defs ast.cpp)
 
-add_library(ast
+add_library(bpftraceast
   async_event_types.cpp
   attachpoint_parser.cpp
   elf_parser.cpp
@@ -21,11 +21,13 @@ add_library(ast
 target_include_directories(ast_defs PUBLIC ${CMAKE_SOURCE_DIR}/src)
 target_include_directories(ast_defs PUBLIC ${CMAKE_SOURCE_DIR}/src/ast)
 target_include_directories(ast_defs PUBLIC ${CMAKE_BINARY_DIR})
-target_link_libraries(ast ast_defs arch parser)
+target_link_libraries(bpftraceast ast_defs bpftracearch bpftraceparser)
+install(TARGETS ast_defs LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR})
+install(TARGETS bpftraceast LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR})
 
-add_dependencies(ast_defs parser)
+add_dependencies(ast_defs bpftraceparser)
 
-target_compile_definitions(ast PRIVATE ${BPFTRACE_FLAGS})
+target_compile_definitions(bpftraceast PRIVATE ${BPFTRACE_FLAGS})
 
 if (STATIC_LINKING)
   set(clang_libs
@@ -58,20 +60,20 @@ if (STATIC_LINKING)
 
 
   if(EMBED_USE_LLVM)
-    target_link_libraries(ast "-Wl,--start-group" ${CLANG_EMBEDDED_CMAKE_TARGETS} ${LLVM_EMBEDDED_CMAKE_TARGETS} "-Wl,--end-group")
+    target_link_libraries(bpftraceast "-Wl,--start-group" ${CLANG_EMBEDDED_CMAKE_TARGETS} ${LLVM_EMBEDDED_CMAKE_TARGETS} "-Wl,--end-group")
   else()
     llvm_map_components_to_libnames(llvm_libs ${llvm_lib_names})
 
     if(TARGET libclang_static)
-      target_link_libraries(ast libclang_static)
+      target_link_libraries(bpftraceast libclang_static)
     else()
       # old LLVM versions don't export libclang_static in ClangTargets.cmake; fall back to
       # libclang.a in that case
-      target_link_libraries(ast libclang.a)    
+      target_link_libraries(abpftracest libclang.a)
     endif()
 
-    target_link_libraries(ast ${clang_libs})
-    target_link_libraries(ast ${llvm_libs})
+    target_link_libraries(abpftracest ${clang_libs})
+    target_link_libraries(abpftracest ${llvm_libs})
   endif()
 
   if(STATIC_LIBC)
@@ -81,11 +83,11 @@ if (STATIC_LINKING)
 else()
   find_library(found_LLVM LLVM HINTS ${LLVM_LIBRARY_DIRS})
   if(found_LLVM)
-    target_link_libraries(ast LLVM)
+    target_link_libraries(bpftraceast LLVM)
   else()
     llvm_map_components_to_libnames(_llvm_libs bpfcodegen ipo irreader mcjit orcjit ${LLVM_TARGETS_TO_BUILD})
     llvm_expand_dependencies(llvm_libs ${_llvm_libs})
-    target_link_libraries(ast ${llvm_libs})
+    target_link_libraries(bpftraceast ${llvm_libs})
   endif()
-  target_link_libraries(ast libclang)
+  target_link_libraries(bpftraceast libclang)
 endif()
diff --git a/src/cxxdemangler/CMakeLists.txt b/src/cxxdemangler/CMakeLists.txt
index 04cfcdd9..5677aa4b 100644
--- a/src/cxxdemangler/CMakeLists.txt
+++ b/src/cxxdemangler/CMakeLists.txt
@@ -1,2 +1,4 @@
 add_library(cxxdemangler_stdlib cxxdemangler_stdlib.cpp)
 add_library(cxxdemangler_llvm cxxdemangler_llvm.cpp)
+install(TARGETS cxxdemangler_stdlib LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR})
+install(TARGETS cxxdemangler_llvm LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR})