Я относительно новичок в C и очень плохо знаком с использованием CMake для сборки из исходного кода.Я нашел эту библиотеку, которую хотел бы использовать на Github:
https://github.com/kolrabi/steamcontroller
В настоящее время у меня возникают проблемы при создании файла примера в хранилище, просто чтобы убедиться, что он работает.Когда я не мог понять, как изменить каталог сборки или избежать дополнительной проверки в верхней части файла make, я решил отредактировать его и удалить, чтобы увидеть, работает ли он лучше (это мой первый раз, когда я использую CMake).Закомментировав верхний оператор IF, который выбрасывает исключение в файле MakeLists.txt (первые 3 строки файла MakeFiles.txt), он выдает эту ошибку:
$ make
Scanning dependencies of target SteamController
[ 11%] Building C object
CMakeFiles/SteamController.dir/steamcontroller_linux.c.o
[ 22%] Building C object
CMakeFiles/SteamController.dir/steamcontroller_win32.c.o
[ 33%] Building C object
CMakeFiles/SteamController.dir/steamcontroller_feedback.c.o
[ 44%] Building C object
CMakeFiles/SteamController.dir/steamcontroller_setup.c.o
[ 55%] Building C object
CMakeFiles/SteamController.dir/steamcontroller_state.c.o
[ 66%] Building C object
CMakeFiles/SteamController.dir/steamcontroller_wireless.c.o
[ 77%] Linking C shared library cygSteamController-0.1.dll
CMakeFiles/SteamController.dir/steamcontroller_feedback.c.o:steamcontroller_feedback.c:(.text+0x175): undefined reference to `SteamController_HIDSetFeatureReport'
...
collect2: error: ld returned 1 exit status
make[2]: *** [CMakeFiles/SteamController.dir/build.make:225:
cygSteamController-0.1.dll] Error 1
make[1]: *** [CMakeFiles/Makefile2:105: CMakeFiles/SteamController.dir/all]
Error 2
make: *** [Makefile:128: all] Error 2
Я полагаю, что ему есть чем занятьсятак как файл заголовка common.h не был включен в библиотеку из-за структур, ошибка ссылается на то, что он включен в этот файл, хотя я не уверен, поскольку это не мой проект.Заранее благодарю за помощь.
Я пытаюсь включить поддержку контроллера Steam в мои собственные программы на Си, как только смог запустить пример.
Вот часть кода, относящегося кк примеру и к файлу CMake:
Отредактированный CMakeLists.txt (оператор Top IF закомментирован):
#IF ( ${CMAKE_SOURCE_DIR} STREQUAL ${CMAKE_BINARY_DIR} )
# MESSAGE ( FATAL_ERROR "Prevented in-tree built. Please create a build directory outside of the source code and call cmake from there" )
#ENDIF ( )
CMAKE_MINIMUM_REQUIRED ( VERSION 2.6 )
PROJECT ( LibSteamController C )
IF ( CMAKE_COMPILER_IS_GNUCC )
SET ( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra -Werror" )
ELSEIF ( MSVC )
SET ( CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /W4 /WX" )
ENDIF ( )
OPTION ( BUILD_STATIC_LIB "Build static library" FALSE )
SET ( SOURCES
steamcontroller_linux.c
steamcontroller_win32.c
steamcontroller_feedback.c
steamcontroller_setup.c
steamcontroller_state.c
steamcontroller_wireless.c
)
IF ( BUILD_STATIC_LIB )
ADD_LIBRARY ( SteamController STATIC ${SOURCES} )
ELSE ( )
ADD_LIBRARY ( SteamController SHARED ${SOURCES} )
SET_TARGET_PROPERTIES ( SteamController PROPERTIES
VERSION "0.1.2"
SOVERSION "0.1" )
ENDIF ( )
ADD_DEFINITIONS ( -DSTEAMCONTROLLER_BUILDING_LIBRARY )
IF ( WIN32 )
TARGET_LINK_LIBRARIES ( SteamController setupapi hid )
ENDIF ( )
ADD_EXECUTABLE ( SteamControllerExample example.c )
TARGET_LINK_LIBRARIES ( SteamControllerExample SteamController )
INSTALL ( TARGETS SteamController
RUNTIME DESTINATION bin
LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib
)
INSTALL ( FILES steamcontroller.h
DESTINATION include
)
example.c:
#include "steamcontroller.h"
#include <stdio.h>
int main() {
SteamControllerDeviceEnum *pEnum = SteamController_EnumControllerDevices();
while (pEnum) {
SteamControllerEvent event;
SteamControllerDevice *pDevice = SteamController_Open(pEnum);
if (pDevice) {
... Test Connection ...
SteamController_Close(pDevice);
}
pEnum = SteamController_NextControllerDevice(pEnum);
}
return 0;
}
common.h:
#pragma once
#include <stdint.h>
#include <assert.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#if _MSC_VER
#define inline __inline
#endif
void Debug_DumpHex(const void *pData, size_t count);
#define USB_VID_VALVE 0x28de
#define USB_PID_STEAMCONTROLLER_WIRED 0x1102
#define USB_PID_STEAMCONTROLLER_WIRELESS 0x1142
#define USB_PID_STEAMCONTROLLER_DONGLE_BOOTLOADER 0x1042
#define STEAMCONTROLLER_CLEAR_MAPPINGS 0x81 // 1000 0001
#define STEAMCONTROLLER_GET_ATTRIBUTES 0x83 // 1000 0011
#define STEAMCONTROLLER_UNKNOWN_85 0x85 // 1000 0101
#define STEAMCONTROLLER_SET_SETTINGS 0x87 // 1000 0111 // seems to reset config
#define STEAMCONTROLLER_UNKNOWN_8E 0x8E // 1000 1110
#define STEAMCONTROLLER_TRIGGER_HAPTIC_PULSE 0x8F // 1000 1111
#define STEAMCONTROLLER_START_BOOTLOADER 0x90 // 1001 0000
#define STEAMCONTROLLER_SET_PRNG_ENTROPY 0x96 // 1001 0110
#define STEAMCONTROLLER_TURN_OFF_CONTROLLER 0x9F // 1001 1111
#define STEAMCONTROLLER_DONGLE_GET_VERSION 0xA1 // 1010 0001
#define STEAMCONTROLLER_ENABLE_PAIRING 0xAD // 1010 1101
#define STEAMCONTROLLER_GET_STRING_ATTRIBUTE 0xAE // 1010 1110
#define STEAMCONTROLLER_UNKNOWN_B1 0xB1 // 1011 0001
#define STEAMCONTROLLER_DISCONNECT_DEVICE 0xB2 // 1011 0010
#define STEAMCONTROLLER_COMMIT_DEVICE 0xB3 // 1011 0011
#define STEAMCONTROLLER_DONGLE_GET_WIRELESS_STATE 0xB4 // 1011 0100
#define STEAMCONTROLLER_PLAY_MELODY 0xB6 // 1011 0110
#define STEAMCONTROLLER_GET_CHIPID 0xBA // 1011 1010
#define STEAMCONTROLLER_WRITE_EEPROM 0xC1 // 1100 0001
typedef struct {
uint8_t reportPage;
uint8_t featureId;
uint8_t dataLen;
uint8_t data[62];
} SteamController_HIDFeatureReport;
bool SteamController_HIDSetFeatureReport(const SteamControllerDevice *pDevice, SteamController_HIDFeatureReport *pReport);
bool SteamController_HIDGetFeatureReport(const SteamControllerDevice *pDevice, SteamController_HIDFeatureReport *pReport);
bool SteamController_Initialize(const SteamControllerDevice *pDevice);
uint8_t SteamController_ReadRaw(const SteamControllerDevice *pDevice, uint8_t *buffer, uint8_t maxLen);
static inline uint8_t LowByte(uint16_t value) { return value & 0xff; }
static inline uint8_t HighByte(uint16_t value) { return (value >> 8) & 0xff; }
static inline void StoreU16(uint8_t *pDestination, uint16_t value) {
pDestination[0] = (value >> 0) & 0xff;
pDestination[2] = (value >> 8) & 0xff;
}
static inline void StoreU32(uint8_t *pDestination, uint32_t value) {
pDestination[0] = (value >> 0) & 0xff;
pDestination[1] = (value >> 8) & 0xff;
pDestination[2] = (value >> 16) & 0xff;
pDestination[3] = (value >> 24) & 0xff;
}