BlueZ scotest App and with Linux Config Can't Connect to SCO Socket - linux

I am using BlueZ 4.101 on an embedded Linux project with Kernel 3.4.79+. Normal Bluetooth operations work great and I can use many headset with my device to transfer Audio. Now I am working towards Bluetooth Compliance and so I am using the Bluetooth SIG's USB PTS Dongle. I am passing every test except for part of the incoming call test where I need to open the SCO connection after accepting a call with the PTS dongle.
The SCO connection attempt works with the headsets but not with the PTS dongle. The error is given from bluetoothd as:
bluetoothd[6306]: audio/headset.c:headset_set_state() State changed /org/bluez/6306/hci0/dev_00_1B_DC_07_30_40: HEADSET_STATE_PLAY_IN_PROGRESS -> HEADSET_STATE_CONNECTED
bluetoothd[6306]: audio/headset.c:headset_set_state() State changed /org/bluez/6306/hci0/dev_00_1B_DC_07_30_40: HEADSET_STATE_CONNECTED -> HEADSET_STATE_PLAY_IN_PROGRESS
bluetoothd[6306]: Protocol not supported (93)
So I compiled scotest from the test directory of BlueZ and ran that after connecting with the dongle and got the same result:
# ./scotest -s -b HELLO 00:1B:DC:07:30:40
scotest[1687]: Can't connect: Protocol not supported (93)
scotest[1687]: Can't connect to the server: Protocol not supported (93)
Here is the do_connect function in scotest.c that is failing in:
static int do_connect(char *svr)
{
struct sockaddr_sco addr;
struct sco_conninfo conn;
socklen_t optlen;
int sk;
/* Create socket */
sk = socket(PF_BLUETOOTH, SOCK_SEQPACKET, BTPROTO_SCO);
if (sk < 0) {
syslog(LOG_ERR, "Can't create socket: %s (%d)",
strerror(errno), errno);
return -1;
}
/* Bind to local address */
memset(&addr, 0, sizeof(addr));
addr.sco_family = AF_BLUETOOTH;
bacpy(&addr.sco_bdaddr, &bdaddr);
if (bind(sk, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
syslog(LOG_ERR, "Can't bind socket: %s (%d)",
strerror(errno), errno);
goto error;
}
/* Connect to remote device */
memset(&addr, 0, sizeof(addr));
addr.sco_family = AF_BLUETOOTH;
str2ba(svr, &addr.sco_bdaddr);
if (connect(sk, (struct sockaddr *) &addr, sizeof(addr)) < 0) {
syslog(LOG_ERR, "Can't connect: %s (%d)",
strerror(errno), errno);
goto error;
}
/* Get connection information */
memset(&conn, 0, sizeof(conn));
optlen = sizeof(conn);
if (getsockopt(sk, SOL_SCO, SCO_CONNINFO, &conn, &optlen) < 0) {
syslog(LOG_ERR, "Can't get SCO connection information: %s (%d)",
strerror(errno), errno);
goto error;
}
syslog(LOG_INFO, "Connected [handle %d, class 0x%02x%02x%02x]",
conn.hci_handle,
conn.dev_class[2], conn.dev_class[1], conn.dev_class[0]);
return sk;
error:
close(sk);
return -1;
}
What am I missing in the Kernel Config to allow the PTS dongle to be put into a Playing state with an open SCO connection?
Here is my .config for Linux ( I'm using backports-3.13.2-1 to support the TI WL1271 BT/WiFi module ):
CPTCFG_IPV6_SUBTREES=y
CPTCFG_NFT_RBTREE=m
CPTCFG_BRIDGE_NF_EBTABLES=m
CPTCFG_BRIDGE_EBT_BROUTE=m
CPTCFG_BRIDGE_EBT_T_FILTER=m
CPTCFG_BRIDGE_EBT_T_NAT=m
CPTCFG_BRIDGE_EBT_802_3=m
CPTCFG_BRIDGE_EBT_AMONG=m
CPTCFG_BRIDGE_EBT_ARP=m
CPTCFG_BRIDGE_EBT_IP=m
CPTCFG_BRIDGE_EBT_IP6=m
CPTCFG_BRIDGE_EBT_LIMIT=m
CPTCFG_BRIDGE_EBT_MARK=m
CPTCFG_BRIDGE_EBT_PKTTYPE=m
CPTCFG_BRIDGE_EBT_STP=m
CPTCFG_BRIDGE_EBT_VLAN=m
CPTCFG_BRIDGE_EBT_ARPREPLY=m
CPTCFG_BRIDGE_EBT_DNAT=m
CPTCFG_BRIDGE_EBT_MARK_T=m
CPTCFG_BRIDGE_EBT_REDIRECT=m
CPTCFG_BRIDGE_EBT_SNAT=m
CPTCFG_BRIDGE_EBT_LOG=m
CPTCFG_BRIDGE_EBT_NFLOG=m
CPTCFG_MAC_EMUMOUSEBTN=m
CPTCFG_RTLBTCOEXIST=m
CPTCFG_TABLET_USB_KBTAB=m
CPTCFG_INPUT_ATLAS_BTNS=m
CPTCFG_SND_BT87X=m
CPTCFG_LIRC_BT829=m
CPTCFG_USB_BTMTK=m
CPTCFG_TOSHIBA_BT_RFKILL=m
CPTCFG_BTRFS_FS=m
CPTCFG_BTRFS_FS_POSIX_ACL=y
CPTCFG_RBTREE_TEST=m
CPTCFG_ASYMMETRIC_PUBLIC_KEY_SUBTYPE=y
CPTCFG_BTREE=y
CPTCFG_BACKPORT_OPTION_BT_SOCK_CREATE_NEEDS_KERN=y
CPTCFG_BT=m
CPTCFG_BT_RFCOMM=m
# CPTCFG_BT_RFCOMM_TTY is not set
CPTCFG_BT_BNEP=m
CPTCFG_BT_BNEP_MC_FILTER=y
CPTCFG_BT_BNEP_PROTO_FILTER=y
# CPTCFG_BT_CMTP is not set
CPTCFG_BT_HIDP=m
CPTCFG_BT_HCIBTUSB=m
CPTCFG_BT_HCIBTSDIO=m
CPTCFG_BT_HCIUART=m
CPTCFG_BT_HCIUART_H4=y
CPTCFG_BT_HCIUART_BCSP=y
# CPTCFG_BT_HCIUART_ATH3K is not set
CPTCFG_BT_HCIUART_LL=y
CPTCFG_BT_HCIUART_3WIRE=y
# CPTCFG_BT_HCIBCM203X is not set
# CPTCFG_BT_HCIBPA10X is not set
# CPTCFG_BT_HCIBFUSB is not set
# CPTCFG_BT_HCIDTL1 is not set
# CPTCFG_BT_HCIBT3C is not set
# CPTCFG_BT_HCIBLUECARD is not set
CPTCFG_BT_HCIBTUART=m
CPTCFG_BT_HCIVHCI=m
# CPTCFG_BT_MRVL is not set
# CPTCFG_BT_ATH3K is not set
CPTCFG_BT_WILINK=m
I instrumented the sco.c file in the kernel with printks.
On success with a normal headset it looks like this after successfully opening SCO connection:
*** sco_sock_create
*** sco_sock_alloc
*** sco_sock_init
*** sco_sock_bind
*** sco_sock_connect
*** sco_connect
*** sco_conn_add
*** sco_chan_add
*** __sco_chan_add
*** sco_sock_set_timer
*** sco_connect_cfm
*** sco_conn_add
*** sco_conn_ready
*** sco_sock_clear_timer
*** sco_sock_getsockopt
*** sco_sock_setsockopt_old
*** sco_sock_getsockopt
*** sco_sock_setsockopt_old
*** sco_sock_sendmsg
*** sco_send_frame
*** sco_sock_sendmsg
*** sco_send_frame
*** sco_sock_sendmsg
*** sco_send_frame
On failure it looks like this:
*** sco_sock_create
*** sco_sock_alloc
*** sco_sock_init
*** sco_sock_bind
*** sco_sock_connect
*** sco_connect
*** sco_conn_add
*** sco_chan_add
*** __sco_chan_add
*** sco_sock_set_timer
*** sco_connect_cfm
*** sco_conn_del
*** sco_chan_get
*** sco_sock_clear_timer
*** sco_chan_del
*** sco_sock_release
*** sco_sock_close
*** sco_sock_kill
*** sco_sock_clear_timer
*** __sco_sock_connect
*** sco_sock_kill
*** sco_sock_kill
*** sco_sock_destruct
Further instrumentation shows the failures are happening in this sco.c function:
void sco_connect_cfm(struct hci_conn *hcon, __u8 status)
{
printk("*** sco_connect_cfm start\n");
BT_DBG("hcon %p bdaddr %pMR status %d", hcon, &hcon->dst, status);
printk("*** sco_connect_cfm_stat hcon %p bdaddr %pMR status %d\n", hcon, &hcon->dst, status);
if (!status) {
struct sco_conn *conn;
conn = sco_conn_add(hcon);
printk("*** sco_connect_cfm sco_conn_add: %d\n",conn);
if (conn)
printk("*** sco_connect_cfm ready\n");
sco_conn_ready(conn);
} else
printk("*** sco_connect_delete: %d\n",status);
sco_conn_del(hcon, bt_to_errno(status));
}
That output looks like this:
*** sco_sock_create
*** sco_sock_alloc
*** sco_sock_init
*** sco_sock_bind
*** sco_sock_connect
*** sco_connect
*** sco_conn_add
*** sco_chan_add
*** __sco_chan_add
*** sco_sock_set_timer
*** sco_connect_cfm start
*** sco_connect_cfm_stat hcon d9ec2400 bdaddr 40:30:07:dc:1b:00 status 26
*** sco_connect_delete: 26
*** sco_conn_del
*** sco_chan_get
*** sco_sock_clear_timer
*** sco_chan_del
*** sco_sock_release
*** sco_sock_close
*** sco_sock_clear_timer
*** sco_sock_kill
*** __sco_sock_connect
*** sco_sock_kill
*** sco_sock_kill
*** sco_sock_destruct

The problem was not the configuration of the Kernel but rather the set of drivers I was using. I had compiled the linux backports ( http://drvbp1.linux-foundation.org/~mcgrof/rel-html/backports/) version of the bluetooth drivers, because I needed the backported wifi drivers, and that gave me the Protocol Not Supported (93) error. I switched back to the drivers distributed with the Kernel 3.4.79+ and it worked.

Related

Failing to insert a custom Kernel module

I'm working on a STM32MP1 target with yocto. In general I can compile a helloworld .ko file and load it into the kernel. But when I want to compile following:
#include <linux/platform_device.h>
#include <linux/module.h>
#include <linux/types.h>
static struct platform_device *pdev;
static int __init fake_eth_add(void)
{
int inst_id = 0;
pdev = platform_device_alloc("fake-eth", inst_id);
platform_device_add(pdev);
pr_info("fake-eth added");
return 0;
}
static void __exit fake_eth_put(void)
{
pr_info("fake-fake removed");
platform_device_put(pdev);
}
module_init(fake_eth_add);
module_exit(fake_eth_put);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("John Madieu <john.madieu#gmail.com>");
I get following errors:
ERROR: modpost: "platform_device_put" [/home/rdm/ethtest/eth-ins.ko] undefined!
ERROR: modpost: "platform_device_add" [/home/rdm/ethtest/eth-ins.ko] undefined!
ERROR: modpost: "platform_device_alloc" [/home/rdm/ethtest/eth-ins.ko] undefined!
I check if the platform_device_alloc Symbol/Function is defined and it does:
root#txmp-1570:/lib/modules/5.7.1/source/kernel# grep -w platform_device_alloc /proc/kallsyms
c0547cfc T platform_device_alloc
Now I have learned that the symbols must be in the Module.symvers File tagged as EXPORT_SYMBOL_GPL. The symbols were not there, so I added them to the Module.symvers file:
0x00000000 platform_device_alloc vmlinux EXPORT_SYMBOL_GPL
0x00000000 platform_device_add vmlinux EXPORT_SYMBOL_GPL
0x00000000 platform_device_put vmlinux EXPORT_SYMBOL_GPL
Now the code compiles! But when I want to load it with insmod, then I get following error:
root#txmp-1570:/home/rdm/ethtest# insmod eth-ins.ko
insmod: ERROR: could not insert module eth-ins.ko: Unknown symbol in module
And the dmseg logs:
[ 2954.658383] eth_ins: Unknown symbol platform_device_put (err -2)
[ 2954.664194] eth_ins: Unknown symbol platform_device_add (err -2)
[ 2954.672737] eth_ins: Unknown symbol platform_device_alloc (err -2)
What am I missing? Why did I have to append the Module.symvers file by myself? Did I miss something regarding setting up the enviromnent for kernel driver development?

Minimalistic Linux Kernel not compiling

I want to compile an own minimalistic Linux Kernel with make tinyconfig and after doing all steps (like here:)
I get this error message:
arch/x86/kernel/apic/apic.c:2282:6: error: redefinition of ‘apic_id_disabled’
bool apic_id_disabled(unsigned int id)
^~~~~~~~~~~~~~~~
In file included from arch/x86/kernel/apic/apic.c:47:0:
./arch/x86/include/asm/apic.h:529:20: note: previous definition of ‘apic_id_disabled’ was here
static inline bool apic_id_disabled(unsigned int id) { return false; }
^~~~~~~~~~~~~~~~
scripts/Makefile.build:330: recipe for target 'arch/x86/kernel/apic/apic.o' failed
make[6]: *** [arch/x86/kernel/apic/apic.o] Error 1
scripts/Makefile.build:604: recipe for target 'arch/x86/kernel/apic' failed
make[5]: *** [arch/x86/kernel/apic] Error 2
scripts/Makefile.build:604: recipe for target 'arch/x86/kernel' failed
make[4]: *** [arch/x86/kernel] Error 2
Makefile:1077: recipe for target 'arch/x86' failed
make[3]: *** [arch/x86] Error 2
make[3]: Verzeichnis „/home/lukas/kernel/linux-source-4.15.0“ wird verlassen
debian/ruleset/targets/common.mk:295: recipe for target 'debian/stamp/build/kernel' failed
make[2]: *** [debian/stamp/build/kernel] Error 2
make[2]: Verzeichnis „/home/lukas/kernel/linux-source-4.15.0“ wird verlassen
debian/ruleset/common/targets.mk:242: recipe for target 'debian/stamp/do-build-arch' failed
make[1]: *** [debian/stamp/do-build-arch] Error 2
make[1]: Verzeichnis „/home/lukas/kernel/linux-source-4.15.0“ wird verlassen
dpkg-buildpackage: Fehler: debian/rules build Unterprozess gibt Abbruchstatus 2 zurück
debian/ruleset/targets/common.mk:401: recipe for target 'debian/stamp/build/buildpackage' failed
make: *** [debian/stamp/build/buildpackage] Error 2
Thank you in advance
#ifdef CONFIG_SMP
535 bool apic_id_is_primary_thread(unsigned int id);
536 bool apic_id_disabled(unsigned int id);
537 #else
538 static inline bool apic_id_is_primary_thread(unsigned int id) { return false; }
539 static inline bool apic_id_disabled(unsigned int id) { return false; }
540 #endif
actually you can see the conflict code in /arch/x86/include/asm/apic.h
from these code, enable SMP in your config is the easiest way to fix this problem.
PROCESS:
make menuconfig
-> Processor type and features
enable [Symmetric multi-processing support] there
then
make -j8 # will compile successfully now

kernel demo build error

In my limited experience with kernel program, my os is Ubuntu16.04,and use sudo apt-get install linux-headers-`uname -r` to install kernel header,and the kernel_hello.c file is
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
MODULE_LICENSE("DUAL BSD/GPL")
MODULE_AUTHOR("YANQIN")
MODULE_DESCRIPTION("kernel module hello")
MODULE_VERSION("1.0")
static int hello_init(void)
{
printk(KERN_ALERT "hello_init() start\n");
return 0;
}
static void hello_exit(void)
{
printk(KERN_ALERT "hello_exit() start\n");
}
module_init(hello_init);
module_exit(hello_exit);
and the Makefile is
KERNAL_DIR ?= /lib/modules/$(shell uname -r)/build
PWD := $(shell pwd)
obj-m := kernel_hello.o
default:
$(MAKE) -C $(KERNAL_DIR) M=$(PWD) modules
but the build result is like this
yq#ubuntu:~/kernelProgram$ make
make -C /lib/modules/4.10.0-28-generic/build M=/home/yq/kernelProgram modules
make[1]: Entering directory '/usr/src/linux-headers-4.10.0-28-generic'
CC [M] /home/yq/kernelProgram/kernel_hello.o
In file included from ./include/linux/module.h:18:0,
from /home/yq/kernelProgram/kernel_hello.c:2:
./include/linux/moduleparam.h:21:1: error: expected ‘,’ or ‘;’ before ‘static’
static const char __UNIQUE_ID(name)[] \
^
./include/linux/module.h:161:32: note: in expansion of macro ‘__MODULE_INFO’
#define MODULE_INFO(tag, info) __MODULE_INFO(tag, tag, info)
^
/home/yq/kernelProgram/kernel_hello.c:6:1: note: in expansion of macro ‘MODULE_AUTHOR’
MODULE_AUTHOR("YANQIN")
^
In file included from /home/yq/kernelProgram/kernel_hello.c:2:0:
/home/yq/kernelProgram/kernel_hello.c: In function ‘__inittest’:
/home/yq/kernelProgram/kernel_hello.c:19:13: error: ‘hello_init’ undeclared (first use in this function)
module_init(hello_init);
^
./include/linux/module.h:131:11: note: in definition of macro ‘module_init’
{ return initfn; } \
^
/home/yq/kernelProgram/kernel_hello.c: At top level:
./include/linux/module.h:132:6: error: ‘init_module’ aliased to undefined symbol ‘hello_init’
int init_module(void) __attribute__((alias(#initfn)));
^
/home/yq/kernelProgram/kernel_hello.c:19:1: note: in expansion of macro
‘module_init’
module_init(hello_init);
^
scripts/Makefile.build:301: recipe for target
'/home/yq/kernelProgram/kernel_hello.o' failed
make[2]: *** [/home/yq/kernelProgram/kernel_hello.o] Error 1
Makefile:1524: recipe for target '_module_/home/yq/kernelProgram' failed
make[1]: *** [_module_/home/yq/kernelProgram] Error 2
make[1]: Leaving directory '/usr/src/linux-headers-4.10.0-28-generic'
Makefile:7: recipe for target 'default' failed
make: *** [default] Error 2
i don't know why it saids the linux kernel header has error
Calls to MODULE_LICENSE and other MODULE_* macros, which setup information about the module, should be terminated with ; like common C instructions

Compiling VNC Server Binary Files (error when running $make)

Hey folks I'm trying to compile a ELF binary server files from here:https://github.com/LibVNC/libvncserver
To do this I follow the steps here: (starting line 10 - 31). I set the NDK toolchains correctly and now I'm trying to run the $configure command
I'm using a 14.04 Ubuntu Machine.
The following command is succesful
$./configure --host=arm-eabi CC=arm-linux-androideabi-gcc
I then run
$make
and get the following error ($make clean ... doesn't help):
root#ip-172-31-35-74:~/Desktop/libvncserver-LibVNCServer-0.9.10#
root#ip-172-31-35-74:~/Desktop/libvncserver-LibVNCServer-0.9.10# make
make all-recursive
make[1]: Entering directory `/home/ubuntu/Desktop/libvncserver-LibVNCServer-0.9.10'
Making all in libvncserver
make[2]: Entering directory `/home/ubuntu/Desktop/libvncserver-LibVNCServer-0.9.10/libvncserver'
CC main.lo
CC rfbserver.lo
rfbserver.c: In function 'rfbProcessFileTransfer':
rfbserver.c:1690:69: warning: pointer targets in passing argument 1 of 'gmtime' differ in signedness [-Wpointer-sign]
strftime(timespec, sizeof(timespec), "%m/%d/%Y %H:%M",gmtime(&statbuf.st_ctime));
^
In file included from rfbserver.c:87:0:
/tmp/my-android-toolchain/sysroot/usr/include/time.h:76:20: note: expected 'const time_t *' but argument is of type 'long unsigned int *'
extern struct tm* gmtime(const time_t *timep);
^
CC rfbregion.lo
CC auth.lo
CC sockets.lo
CC websockets.lo
CC rfbssl_none.lo
CC rfbcrypto_included.lo
In file included from rfbcrypto_included.c:25:0:
../common/md5.h: In function '__md5_init_ctx':
../common/md5.h:101:50: error: expected declaration specifiers before '__THROW'
extern void __md5_init_ctx (struct md5_ctx *ctx) __THROW;
^
../common/md5.h:108:39: error: expected '=', ',', ';', 'asm' or '__attribute__' before '__THROW'
struct md5_ctx *ctx) __THROW;
^
../common/md5.h:115:39: error: expected '=', ',', ';', 'asm' or '__attribute__' before '__THROW'
struct md5_ctx *ctx) __THROW;
^
../common/md5.h:124:67: error: expected '=', ',', ';', 'asm' or '__attribute__' before '__THROW'
extern void *__md5_finish_ctx (struct md5_ctx *ctx, void *resbuf) __THROW;
^
../common/md5.h:133:71: error: expected '=', ',', ';', 'asm' or '__attribute__' before '__THROW'
extern void *__md5_read_ctx (const struct md5_ctx *ctx, void *resbuf) __THROW;
^
../common/md5.h:139:56: error: expected '=', ',', ';', 'asm' or '__attribute__' before '__THROW'
extern int __md5_stream (FILE *stream, void *resblock) __THROW;
^
../common/md5.h:146:32: error: expected '=', ',', ';', 'asm' or '__attribute__' before '__THROW'
void *resblock) __THROW;
^
In file included from rfbcrypto_included.c:26:0:
../common/sha1.h:62:1: warning: empty declaration
enum
^
../common/sha1.h:89:3: error: storage class specified for parameter 'SHA1Context'
} SHA1Context;
^
../common/sha1.h:94:17: error: expected declaration specifiers or '...' before 'SHA1Context'
int SHA1Reset( SHA1Context *);
^
../common/sha1.h:95:17: error: expected declaration specifiers or '...' before 'SHA1Context'
int SHA1Input( SHA1Context *,
^
../common/sha1.h:98:17: error: expected declaration specifiers or '...' before 'SHA1Context'
int SHA1Result( SHA1Context *,
^
rfbcrypto_included.c:30:1: error: expected '=', ',', ';', 'asm' or '__attribute__' before '{' token
{
^
rfbcrypto_included.c:41:1: error: expected '=', ',', ';', 'asm' or '__attribute__' before '{' token
{
^
In file included from rfbcrypto_included.c:25:0:
../common/md5.h:101:13: error: old-style parameter declarations in prototyped function definition
extern void __md5_init_ctx (struct md5_ctx *ctx) __THROW;
^
rfbcrypto_included.c:49:1: error: expected '{' at end of input
}
^
make[2]: *** [rfbcrypto_included.lo] Error 1
make[2]: Leaving directory `/home/ubuntu/Desktop/libvncserver-LibVNCServer-0.9.10/libvncserver'
make[1]: *** [all-recursive] Error 1
make[1]: Leaving directory `/home/ubuntu/Desktop/libvncserver-LibVNCServer-0.9.10'
make: *** [all] Error 2
root#ip-172-31-35-74:~/Desktop/libvncserver-LibVNCServer-0.9.10#
root#ip-172-31-35-74:~/Desktop/libvncserver-LibVNCServer-0.9.10#

Visual C++ MySQL Connector/C errors?

My source code results in this:
// MySQL.cpp : Defines the entry point for the console application.
//
#include <iostream>
#include <winsock.h>
#include <string>
#include <sstream>
#include <stdio.h>
#include <mysql.h>
#define TABLE_OF_INTEREST "some_table"
#define SERVER_NAME "mysql_server"
#define DB_USER "user"
#define DB_USERPASS "pa55w0rd"
#define DB_NAME "db_name"
#define NEWLINE "\n"
using namespace std;
int main()
{
MYSQL *hnd = NULL; // mysql connection handle
const char *sinf = NULL; // mysql server information
if(!mysql_real_connect(hnd, SERVER_NAME, DB_USER, DB_USERPASS, DB_NAME, 0, NULL, 0)
cout << "Something happened.";
return 0;
}
error:
1>------ Build started: Project: MySQL, Configuration: Release Win32 ------
1> MySQL.cpp
1>MySQL.obj : error LNK2001: unresolved external symbol _mysql_real_connect#32
1>c:\users\josiah\documents\visual studio 2010\Projects\MySQL\Release\MySQL.exe : fatal error LNK1120: 1 unresolved external
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
I don't think there issues with the source, I just need help on how to figure out where the problem is.
You're missing a reference to a lib. The C connector should have come with a .lib, add it to the additional input for the linker

Resources