diff --git a/src/libcamera/ipa_proxy.cpp b/src/libcamera/ipa_proxy.cpp
index b409e1d..1014e79 100644
--- a/src/libcamera/ipa_proxy.cpp
+++ b/src/libcamera/ipa_proxy.cpp
@@ -91,10 +91,23 @@ std::string IPAProxy::resolvePath(const std::string &file) const
 		}
 	}
 
-	/* Try finding the exec target from the install directory. */
-	std::string proxyPath = std::string(IPA_PROXY_DIR) + proxyFile;
-	if (!access(proxyPath.c_str(), X_OK))
-		return proxyPath;
+	/*
+	 * When libcamera is used before it is installed, load proxies from the
+	 * same build directory as the libcamera directory itself. This requires
+	 * identifying the path of the libcamera.so, and referencing a relative
+	 * path for the proxies from that point.
+	 */
+	if (!utils::isLibcameraInstalled()) {
+		std::string ipaProxyDir = utils::dirname(utils::libcameraPath()) + "/../../proxy";
+
+		LOG(IPAProxy, Info)
+			<< "libcamera is not installed. Adding '"
+			<< ipaProxyDir << "' to the Proxy search path";
+
+		std::string proxyPath = ipaProxyDir + proxyFile;
+		if (!access(proxyPath.c_str(), X_OK))
+			return proxyPath;
+	}
 
 	return std::string();
 }
