Hi.
I’d like to compile libwebsocket but I couldn’t compile it. I’m using C and iMX6ULL.
Please let me know how to set Eclipse.
I referred here link text. You can see the followings.
git clone https://github.com/warmcat/libwebsockets.git
sudo apt-get install libssl-dev
mkdir build
cd build
cmake ..
make
sudo make install
ldconfig
pkg-config --modversion libwebsockets
The followings are my setting values in Eclipse.
C/C++ Build > Settings > Cross GCC Compiler ==> ${CC}
includes ==> /usr/local/include
Miscellaneous ==> ${CFLAGS} -c
Cross GCC Linker ==> ${CXX}
Libraries ==> Libraries (-l) ==> websockets
Library search path (-L) /usr/local/lib
Miscellaneous ==> ${LDFLAGS}
Cross GCC Assembler ==> ${AS}
I compiled the following example.
#include <stdio.h>
#include <stdlib.h>
#include <libwebsockets.h>
static int callback_http(struct lws_context * this,
struct libwebsocket *wsi,
enum lws_callback_reasons reason, void *user,
void *in, size_t len)
{
return 0;
}
static int callback_dumb_increment(struct lws_context * this,
struct libwebsocket *wsi,
enum lws_callback_reasons reason,
void *user, void *in, size_t len)
{
switch (reason) {
case LWS_CALLBACK_ESTABLISHED: // just log message that someone is connecting
printf("connection established\n");
break;
case LWS_CALLBACK_RECEIVE: { // the funny part
// create a buffer to hold our response
// it has to have some pre and post padding. You don't need to care
// what comes there, libwebsockets will do everything for you. For more info see
// http://git.warmcat.com/cgi-bin/cgit/libwebsockets/tree/lib/libwebsockets.h#n597
unsigned char *buf = (unsigned char*) malloc(LWS_SEND_BUFFER_PRE_PADDING + len +
LWS_SEND_BUFFER_POST_PADDING);
int i;
// pointer to `void *in` holds the incomming request
// we're just going to put it in reverse order and put it in `buf` with
// correct offset. `len` holds length of the request.
for (i=0; i < len; i++) {
buf[LWS_SEND_BUFFER_PRE_PADDING + (len - 1) - i ] = ((char *) in)[i];
}
// log what we recieved and what we're going to send as a response.
// that disco syntax `%.*s` is used to print just a part of our buffer
// http://stackoverflow.com/questions/5189071/print-part-of-char-array
printf("received data: %s, replying: %.*s\n", (char *) in, (int) len,
buf + LWS_SEND_BUFFER_PRE_PADDING);
// send response
// just notice that we have to tell where exactly our response starts. That's
// why there's `buf[LWS_SEND_BUFFER_PRE_PADDING]` and how long it is.
// we know that our response has the same length as request because
// it's the same message in reverse order.
lws_write(wsi, &buf[LWS_SEND_BUFFER_PRE_PADDING], len, LWS_WRITE_TEXT);
// release memory back into the wild
free(buf);
break;
}
default:
break;
}
return 0;
}
static struct lws_protocols protocols[] = {
/* first protocol must always be HTTP handler */
{
"http-only", // name
callback_http, // callback
0 // per_session_data_size
},
{
"dumb-increment-protocol", // protocol name - very important!
callback_dumb_increment, // callback
0 // we don't use any per session data
},
{
NULL, NULL, 0 /* End of list */
}
};
int main(void) {
// server url will be http://localhost:9000
int port = 9000;
struct lws_context *context;
struct lws_context_creation_info context_info =
{
.port = port, .iface = NULL, .protocols = protocols, .extensions = NULL,
.ssl_cert_filepath = NULL, .ssl_private_key_filepath = NULL, .ssl_ca_filepath = NULL,
.gid = -1, .uid = -1, .options = 0, NULL, .ka_time = 0, .ka_probes = 0, .ka_interval = 0
};
// create libwebsocket context representing this server
context = lws_create_context(&context_info);
if (context == NULL) {
fprintf(stderr, "libwebsocket init failed\n");
return -1;
}
printf("starting server...\n");
// infinite loop, to end this server send SIGTERM. (CTRL+C)
while (1) {
lws_service(context, 50);
// lws_service will process all waiting events with their
// callback functions and then wait 50 ms.
// (this is a single threaded webserver and this will keep our server
// from generating load while there are not requests to process)
}
lws_context_destroy(context);
return 0;
}
The following is the link errror. The compiler can’t find websocket library.
Building target: test_wss
Invoking: Cross GCC Linker
arm-angstrom-linux-gnueabi-g++ -march=armv7-a -mthumb -mfpu=neon -mfloat-abi=hard --sysroot=/usr/local/oecore-x86_64/sysroots/armv7at2hf-neon-angstrom-linux-gnueabi -L/usr/local/lib -Wl,-O1 -Wl,--hash-style=gnu -Wl,--as-needed -o "test_wss" ./test_wss.o -lwebsockets
/usr/local/oecore-x86_64/sysroots/x86_64-angstromsdk-linux/usr/libexec/arm-angstrom-linux-gnueabi/gcc/arm-angstrom-linux-gnueabi/7.3.0/real-ld: warning: skipping incompatible /usr/local/lib/libwebsockets.so while searching for websockets
/usr/local/oecore-x86_64/sysroots/x86_64-angstromsdk-linux/usr/libexec/arm-angstrom-linux-gnueabi/gcc/arm-angstrom-linux-gnueabi/7.3.0/real-ld: error: cannot find -lwebsockets
../test_wss.c:60: error: undefined reference to 'lws_write'
../test_wss.c:103: error: undefined reference to 'lws_create_context'
../test_wss.c:114: error: undefined reference to 'lws_service'
collect2: error: ld returned 1 exit status
make: *** [test_wss] Error 1
makefile:29: recipe for target 'test_wss' failed
The following is my library directory. There is libwebsocket.so.
r@p:/usr/local/lib$ ll
total 1320
drwxr-xr-x 6 root root 4096 Mar 2 16:42 ./
drwxr-xr-x 12 root root 4096 Oct 18 13:40 ../
drwxr-xr-x 3 root root 4096 Mar 2 13:30 cmake/
-rw-r--r-- 1 root root 799572 Mar 2 16:41 libwebsockets.a
lrwxrwxrwx 1 root root 19 Mar 2 13:30 libwebsockets.so -> libwebsockets.so.15
-rw-r--r-- 1 root root 522136 Mar 2 16:42 libwebsockets.so.15
drwxr-xr-x 2 root root 4096 Mar 2 16:42 pkgconfig/
drwxrwsr-x 4 root staff 4096 Oct 10 16:23 python2.7/
drwxrwsr-x 3 root staff 4096 Feb 27 2019 python3.5/
r@p:/usr/local/lib$
r@p:/usr/local/include$ ll
total 52
drwxr-xr-x 3 root root 4096 Mar 2 16:42 ./
drwxr-xr-x 12 root root 4096 Oct 18 13:40 ../
drwxr-xr-x 3 root root 4096 Mar 2 16:42 libwebsockets/
-rw-r--r-- 1 root root 15746 Mar 2 16:39 libwebsockets.h
-rw-r--r-- 1 root root 5561 Mar 2 16:41 lws_config.h
-rw-r--r-- 1 root root 14468 Mar 2 16:40 lws-plugin-ssh.h
r@p:/usr/local/include$