diff --git a/src/audio_core/CMakeLists.txt b/src/audio_core/CMakeLists.txt
index a72a907ef38c96fbeeed169d4a2cb502730befb5..c571213fc082a6f96d888fa2563c984f457aa552 100644
--- a/src/audio_core/CMakeLists.txt
+++ b/src/audio_core/CMakeLists.txt
@@ -38,9 +38,10 @@ endif()
 create_directory_groups(${SRCS} ${HEADERS})
 
 add_library(audio_core STATIC ${SRCS} ${HEADERS})
-target_link_libraries(audio_core SoundTouch)
+target_link_libraries(audio_core PUBLIC common core)
+target_link_libraries(audio_core PRIVATE SoundTouch)
 
 if(SDL2_FOUND)
-    target_link_libraries(audio_core ${SDL2_LIBRARY})
-    set_property(TARGET audio_core APPEND PROPERTY COMPILE_DEFINITIONS HAVE_SDL2)
+    target_link_libraries(audio_core PRIVATE ${SDL2_LIBRARY})
+    target_compile_definitions(audio_core PRIVATE HAVE_SDL2)
 endif()
diff --git a/src/citra/CMakeLists.txt b/src/citra/CMakeLists.txt
index 47231ba719a09749af922f2aec5b365153a3337f..9eddb342be2466402ad4ab42e264a6037487a8cf 100644
--- a/src/citra/CMakeLists.txt
+++ b/src/citra/CMakeLists.txt
@@ -18,12 +18,12 @@ create_directory_groups(${SRCS} ${HEADERS})
 include_directories(${SDL2_INCLUDE_DIR})
 
 add_executable(citra ${SRCS} ${HEADERS})
-target_link_libraries(citra core video_core audio_core common input_common)
-target_link_libraries(citra ${SDL2_LIBRARY} ${OPENGL_gl_LIBRARY} inih glad)
+target_link_libraries(citra PRIVATE common core input_common)
+target_link_libraries(citra PRIVATE ${SDL2_LIBRARY} ${OPENGL_gl_LIBRARY} inih glad)
 if (MSVC)
-    target_link_libraries(citra getopt)
+    target_link_libraries(citra PRIVATE getopt)
 endif()
-target_link_libraries(citra ${PLATFORM_LIBRARIES} Threads::Threads)
+target_link_libraries(citra PRIVATE ${PLATFORM_LIBRARIES} Threads::Threads)
 
 if(UNIX AND NOT APPLE)
     install(TARGETS citra RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}/bin")
diff --git a/src/citra_qt/CMakeLists.txt b/src/citra_qt/CMakeLists.txt
index 4e837668efe505c37d06153b18d9107703c6fcb7..809e0b9385955f98266d1f04a34821cfbeda5971 100644
--- a/src/citra_qt/CMakeLists.txt
+++ b/src/citra_qt/CMakeLists.txt
@@ -91,9 +91,9 @@ if (APPLE)
 else()
     add_executable(citra-qt ${SRCS} ${HEADERS} ${UI_HDRS})
 endif()
-target_link_libraries(citra-qt core video_core audio_core common input_common)
-target_link_libraries(citra-qt ${OPENGL_gl_LIBRARY} ${CITRA_QT_LIBS})
-target_link_libraries(citra-qt ${PLATFORM_LIBRARIES} Threads::Threads)
+target_link_libraries(citra-qt PRIVATE audio_core common core input_common video_core)
+target_link_libraries(citra-qt PRIVATE ${OPENGL_gl_LIBRARY} ${CITRA_QT_LIBS} glad)
+target_link_libraries(citra-qt PRIVATE ${PLATFORM_LIBRARIES} Threads::Threads)
 
 if(UNIX AND NOT APPLE)
     install(TARGETS citra-qt RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}/bin")
diff --git a/src/common/CMakeLists.txt b/src/common/CMakeLists.txt
index 546a145004563cb2088ad20cca9d1545529e1391..a33a8cdbeba6480c49366261cc77d9885bf37b4d 100644
--- a/src/common/CMakeLists.txt
+++ b/src/common/CMakeLists.txt
@@ -96,5 +96,5 @@ create_directory_groups(${SRCS} ${HEADERS})
 
 add_library(common STATIC ${SRCS} ${HEADERS})
 if (ARCHITECTURE_x86_64)
-    target_link_libraries(common xbyak)
+    target_link_libraries(common PRIVATE xbyak)
 endif()
diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt
index cbfd1299cfcf91b324ac181eabaf79a549dabc5a..7aa81e885089ac1ce5284991636cf6b07626427f 100644
--- a/src/core/CMakeLists.txt
+++ b/src/core/CMakeLists.txt
@@ -380,5 +380,5 @@ include_directories(../../externals/cryptopp)
 create_directory_groups(${SRCS} ${HEADERS})
 
 add_library(core STATIC ${SRCS} ${HEADERS})
-
-target_link_libraries(core dynarmic cryptopp)
+target_link_libraries(core PUBLIC common PRIVATE audio_core video_core)
+target_link_libraries(core PRIVATE cryptopp dynarmic)
diff --git a/src/input_common/CMakeLists.txt b/src/input_common/CMakeLists.txt
index cfe5caaa3905879ca1dab021d257133190b4f9ab..5b306e42e7ce8a2f999b5c5a1aef1e6a4f8f2220 100644
--- a/src/input_common/CMakeLists.txt
+++ b/src/input_common/CMakeLists.txt
@@ -19,9 +19,9 @@ endif()
 create_directory_groups(${SRCS} ${HEADERS})
 
 add_library(input_common STATIC ${SRCS} ${HEADERS})
-target_link_libraries(input_common common core)
+target_link_libraries(input_common PUBLIC core PRIVATE common)
 
 if(SDL2_FOUND)
-    target_link_libraries(input_common ${SDL2_LIBRARY})
-    set_property(TARGET input_common APPEND PROPERTY COMPILE_DEFINITIONS HAVE_SDL2)
+    target_link_libraries(input_common PRIVATE ${SDL2_LIBRARY})
+    target_compile_definitions(input_common PRIVATE HAVE_SDL2)
 endif()
diff --git a/src/tests/CMakeLists.txt b/src/tests/CMakeLists.txt
index d1144ba77c7c8ef5ed5bb541cbe2f2112b4a1813..85f2f29857e6f9b08e100465757c71020357c7c3 100644
--- a/src/tests/CMakeLists.txt
+++ b/src/tests/CMakeLists.txt
@@ -13,7 +13,8 @@ create_directory_groups(${SRCS} ${HEADERS})
 include_directories(../../externals/catch/single_include/)
 
 add_executable(tests ${SRCS} ${HEADERS})
-target_link_libraries(tests core video_core audio_core common)
-target_link_libraries(tests ${PLATFORM_LIBRARIES} Threads::Threads)
+target_link_libraries(tests PRIVATE common core)
+target_link_libraries(tests PRIVATE glad) # To support linker work-around
+target_link_libraries(tests PRIVATE ${PLATFORM_LIBRARIES} Threads::Threads)
 
 add_test(NAME tests COMMAND $<TARGET_FILE:tests>)
diff --git a/src/video_core/CMakeLists.txt b/src/video_core/CMakeLists.txt
index e00b88f718e802165e86af21decffea81dcc03ae..e455f03bd193bcf0081be3cd3550b7dc561a6927 100644
--- a/src/video_core/CMakeLists.txt
+++ b/src/video_core/CMakeLists.txt
@@ -79,13 +79,15 @@ endif()
 create_directory_groups(${SRCS} ${HEADERS})
 
 add_library(video_core STATIC ${SRCS} ${HEADERS})
-target_link_libraries(video_core glad)
+target_link_libraries(video_core PUBLIC common core)
+target_link_libraries(video_core PRIVATE glad)
+
 if (ARCHITECTURE_x86_64)
-    target_link_libraries(video_core xbyak)
+    target_link_libraries(video_core PRIVATE xbyak)
 endif()
 
 if (PNG_FOUND)
-    target_link_libraries(video_core ${PNG_LIBRARIES})
-    include_directories(${PNG_INCLUDE_DIRS})
-    add_definitions(${PNG_DEFINITIONS})
+    target_link_libraries(video_core PRIVATE ${PNG_LIBRARIES})
+    target_include_directories(video_core PRIVATE ${PNG_INCLUDE_DIRS})
+    target_compile_definitions(video_core PRIVATE ${PNG_DEFINITIONS})
 endif()