Skip to main content

Can't compile C code on Windows 10, to use it as Python module

I tried some python modules and they did not satisfyed me. So I decided now to create my own little module to track KeyBoardInput with the help of c. On Linux everything works fine but on Windows the oder hand i have problems compiling the Code. I am using Python 3.11.1 and Windows 10.

I get this Error Message:

gcc -shared -o custom_keyboard.pyd -I "C:/Program Files/Python311/include" -L"C:/Program Files/Python311/libs" -lpython311 custom_keyboard.c
In file included from C:/Program Files/Python311/include/Python.h:86:0,
                 from custom_keyboard.c:1:
C:/Program Files/Python311/include/cpython/pytime.h:184:12: warning: 'struct timeval' declared inside parameter list will not be visible outside of this definition or declaration
     struct timeval *tv,
            ^~~~~~~
C:/Program Files/Python311/include/cpython/pytime.h:190:12: warning: 'struct timeval' declared inside parameter list will not be visible outside of this definition or declaration
     struct timeval *tv,
            ^~~~~~~
C:\Users\MUDDYB~1\AppData\Local\Temp\ccVKY98K.o:custom_keyboard.c:(.text+0x15): undefined reference to `_imp__PyArg_ParseTuple'
C:\Users\MUDDYB~1\AppData\Local\Temp\ccVKY98K.o:custom_keyboard.c:(.text+0x4d): undefined reference to `_imp__Py_BuildValue'
C:\Users\MUDDYB~1\AppData\Local\Temp\ccVKY98K.o:custom_keyboard.c:(.text+0x6b): undefined reference to `_imp__PyModule_Create2'
collect2.exe: error: ld returned 1 exit status

And I used this piece of code:

#include <Python.h>

#ifdef _WIN32
// Windows specific includes
#include <conio.h>
#else
// Unix specific includes
#include <termios.h>
#include <unistd.h>
#include <stdio.h>
#endif

static PyObject *read_key(PyObject *self, PyObject *args)
{
    if (!PyArg_ParseTuple(args, ""))
    {
        return NULL;
    }

#ifdef _WIN32
    // Windows implementation
    int key = 0;
    if (_kbhit())
    {
        key = _getch();
    }
#else
    // Unix implementation
    struct termios old_tio, new_tio;
    tcgetattr(STDIN_FILENO, &old_tio);
    new_tio = old_tio;
    new_tio.c_lflag &= ~(ICANON | ECHO);
    tcsetattr(STDIN_FILENO, TCSANOW, &new_tio);

    int key = 0;
    char buf = 0;
    ssize_t n;
    if ((n = read(STDIN_FILENO, &buf, 1)) > 0)
    {
        key = buf;
    }

    tcsetattr(STDIN_FILENO, TCSANOW, &old_tio);
#endif

    return Py_BuildValue("i", key);
}

static PyMethodDef keyboardMethods[] = {
    {"read_key", read_key, METH_VARARGS, "Reads a single key from the keyboard."},
    {NULL, NULL, 0, NULL}};

static struct PyModuleDef keyboardModule = {
    PyModuleDef_HEAD_INIT,
    "keyboard",
    NULL,
    -1,
    keyboardMethods};

PyMODINIT_FUNC PyInit_custom_keyboard(void)
{
    return PyModule_Create(&keyboardModule);
}

So I found this Thread but changing PyInit_custom_keyboard to Pycustom_keyboard_Create Didn't help.

Using the Developer Shell of Visual Studio with:

cl /LD /I"C:\Program Files\Python311\include" custom_keyboard.c /link /LIBPATH:"C:\Program Files\Python311\libs" /OUT:custom_keyboard.pyd

I get this Error:

C:\Program Files\Python311\libs\python311.lib: Warning LNK4272:Library computer type "x64" conflicts with target computer type "x86"
custom_keyboard.pyd : fatal error LNK1120: 3 unresolved externals


source https://stackoverflow.com/questions/76067814/cant-compile-c-code-on-windows-10-to-use-it-as-python-module

Comments

Popular posts from this blog

Why is my reports service not connecting?

I am trying to pull some data from a Postgres database using Node.js and node-postures but I can't figure out why my service isn't connecting. my routes/index.js file: const express = require('express'); const router = express.Router(); const ordersCountController = require('../controllers/ordersCountController'); const ordersController = require('../controllers/ordersController'); const weeklyReportsController = require('../controllers/weeklyReportsController'); router.get('/orders_count', ordersCountController); router.get('/orders', ordersController); router.get('/weekly_reports', weeklyReportsController); module.exports = router; My controllers/weeklyReportsController.js file: const weeklyReportsService = require('../services/weeklyReportsService'); const weeklyReportsController = async (req, res) => { try { const data = await weeklyReportsService; res.json({data}) console...

How to show number of registered users in Laravel based on usertype?

i'm trying to display data from the database in the admin dashboard i used this: <?php use Illuminate\Support\Facades\DB; $users = DB::table('users')->count(); echo $users; ?> and i have successfully get the correct data from the database but what if i want to display a specific data for example in this user table there is "usertype" that specify if the user is normal user or admin i want to user the same code above but to display a specific usertype i tried this: <?php use Illuminate\Support\Facades\DB; $users = DB::table('users')->count()->WHERE usertype =admin; echo $users; ?> but it didn't work, what am i doing wrong? source https://stackoverflow.com/questions/68199726/how-to-show-number-of-registered-users-in-laravel-based-on-usertype

The number of nodes and edges I calculated manually and by a method provided by networkx library dont match

I am trying to analyse a graph using networkx library in Python. I have implemented a function that returns the nodes and edges of that graph. After that I counted the number of nodes and edges by implementing the len() function for nodes and edges, which gave me 17 for both nodes and edges. However, when I used the method graph.number_of_nodes() of networkx library it gave me 53. My code: import pandas as pd import networkx as nx import matplotlib.pyplot as plt header_list = ["a","b","w"] E =pd.read_csv("aves-barn-swallow-contact-network.edges",sep=" ",header= None,names=header_list) # print(E.head()) # prints first few rows of the csv file G = nx.from_pandas_edgelist(E,"a","b",["w"]) nx.draw(G) plt.show() class GraphAnalyse: #finding nodes and edges def nodeEdge(self,Graph): nodes = Graph.nodes() edges = Graph.edges() ...