diff -bur vrpn-07.35-orig/CMakeLists.txt vrpn-07.35/CMakeLists.txt
--- vrpn-07.35-orig/CMakeLists.txt	2024-02-28 22:14:55.826965700 -0700
+++ vrpn-07.35/CMakeLists.txt	2024-02-28 22:16:44.742742700 -0700
@@ -1284,9 +1284,12 @@
 set(VRPN_CLIENT_LIBRARY)
 
 if(VRPN_BUILD_SERVER_LIBRARY)
-	add_library(vrpnserver
-		${VRPN_SERVER_SOURCES}
-		${VRPN_SERVER_PUBLIC_HEADERS})
+	if(VRPN_USE_SHARED_LIBRARY)
+		add_library(vrpnserver SHARED ${VRPN_SERVER_SOURCES} ${VRPN_SERVER_PUBLIC_HEADERS})
+		set_target_properties(vrpnserver PROPERTIES COMPILE_DEFINITIONS VRPNDLL_EXPORTS=1)
+	else()
+		add_library(vrpnserver STATIC ${VRPN_SERVER_SOURCES} ${VRPN_SERVER_PUBLIC_HEADERS})
+	endif()
 	target_link_libraries(vrpnserver ${EXTRA_LIBS} ${SERVER_EXTRA_LIBS})
 	set(VRPN_CLIENT_LIBRARY vrpnserver)
 	set(VRPN_SERVER_LIBRARY vrpnserver)
@@ -1337,7 +1340,12 @@
 
 
 if(VRPN_BUILD_CLIENT_LIBRARY)
-	add_library(vrpn ${VRPN_CLIENT_SOURCES} ${VRPN_CLIENT_PUBLIC_HEADERS})
+	if(VRPN_USE_SHARED_LIBRARY)
+		add_library(vrpn SHARED ${VRPN_CLIENT_SOURCES} ${VRPN_CLIENT_PUBLIC_HEADERS})
+		set_target_properties(vrpn PROPERTIES COMPILE_DEFINITIONS VRPNDLL_EXPORTS=1)
+	else()
+		add_library(vrpn STATIC ${VRPN_CLIENT_SOURCES} ${VRPN_CLIENT_PUBLIC_HEADERS})
+	endif()
 	target_link_libraries(vrpn ${EXTRA_LIBS})
 	set(VRPN_CLIENT_LIBRARY vrpn)
 
@@ -1355,7 +1363,7 @@
   # Always compile code the client library with VRPN_CLIENT_ONLY defined.
   set_property(TARGET
     vrpn
-    PROPERTY
+    APPEND PROPERTY
     COMPILE_DEFINITIONS
     "VRPN_CLIENT_ONLY")
 
diff -bur vrpn-07.35-orig/server_src/vrpn_Generic_server_object.h vrpn-07.35/server_src/vrpn_Generic_server_object.h
--- vrpn-07.35-orig/server_src/vrpn_Generic_server_object.h	2024-02-28 22:14:55.800273500 -0700
+++ vrpn-07.35/server_src/vrpn_Generic_server_object.h	2024-02-28 22:18:05.367469200 -0700
@@ -15,7 +15,7 @@
 class VRPN_API vrpn_IMU_Axis_Params;
 class VRPN_API vrpn_PA_axis;
 
-class vrpn_Generic_Server_Object {
+class VRPN_API vrpn_Generic_Server_Object {
 public:
     vrpn_Generic_Server_Object(vrpn_Connection *connection_to_use,
                                const char *config_file_name = "vrpn.cfg",
diff -bur vrpn-07.35-orig/vrpn_Shared.h vrpn-07.35/vrpn_Shared.h
--- vrpn-07.35-orig/vrpn_Shared.h	2024-02-28 22:14:55.842649500 -0700
+++ vrpn-07.35/vrpn_Shared.h	2024-02-28 22:19:48.984720100 -0700
@@ -499,7 +499,7 @@
 }
 
 // Returns true if tests work and false if they do not.
-extern bool vrpn_test_pack_unpack(void);
+VRPN_API bool vrpn_test_pack_unpack(void);
 
 /// Null-terminated-string copy function that both guarantees not to overrun
 /// the buffer and guarantees that the last character copied is a NULL terminator
diff -bur vrpn-07.35-orig/vrpn_Thread.h vrpn-07.35/vrpn_Thread.h
--- vrpn-07.35-orig/vrpn_Thread.h	2024-02-28 22:14:55.842649500 -0700
+++ vrpn-07.35/vrpn_Thread.h	2024-02-28 22:19:44.087038900 -0700
@@ -237,7 +237,7 @@
 };
 
 // Returns true if they work and false if they do not.
-extern bool vrpn_test_threads_and_semaphores(void);
+VRPN_API bool vrpn_test_threads_and_semaphores(void);
 
 
 
