Неопределенная ссылка на файл в CMake при сборке библиотеки из исходного кода - PullRequest
0 голосов
/ 20 декабря 2018

Я относительно новичок в 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...