简体   繁体   中英

clang: error: linker command failed with exit code 1 (use -v to see invocation) MINIX3

I am trying to run a C/C++ application on MINIX3 which is supposed to send a messages between two processes using msgsnd() and msgget() using msg.h.

This is the error I am getting:

send.cpp:(.text+0x7f): undefined reference to `msgget'
send.cpp:(.text+0x1c1): undefined reference to `msgsnd'
clang: error: linker command failed with exit code 1 (use -v to see invocation)

I am using clang++ to compile the code:

clang++ send.cpp -o send.out

This is the send.cpp code:

#include <lib.h>
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/msg.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define MSGSZ     128
/*
* Declare the message structure.
*/

typedef struct msgbufer {
    long    mtype;
    char    mtext[MSGSZ];
} message_buf;

int main()
{
    int msqid;
    int msgflg = IPC_CREAT | 0666;
    key_t key;
    message_buf sbuf;
    size_t buf_length;

    /*
    * Get the message queue id for the
    * "name" 1234, which was created by
    * the server.
    */
    key = 1234;

    (void)fprintf(stderr, "\nmsgget: Calling msgget(%i,\
                          %#o)\n",
                          key, msgflg);

    if ((msqid = msgget(key, msgflg)) < 0) {
        perror("msgget");
        exit(1);
    }
    else
        (void)fprintf(stderr, "msgget: msgget succeeded: msqid = %d\n", msqid);


    /*
    * We'll send message type 1
    */

    sbuf.mtype = 1;

    (void)fprintf(stderr, "msgget: msgget succeeded: msqid = %d\n", msqid);

    (void)strcpy(sbuf.mtext, "Hello other process 2.");

    (void)fprintf(stderr, "msgget: msgget succeeded: msqid = %d\n", msqid);

    buf_length = strlen(sbuf.mtext) + 1;



    /*
    * Send a message.
    */
    if (msgsnd(msqid, &sbuf, buf_length, IPC_NOWAIT) < 0) {
        printf("%d, %li, %s, %lu\n", msqid, sbuf.mtype, sbuf.mtext, buf_length);
        perror("msgsnd");
        exit(1);
    }

    else
        printf("Message: \"%s\" Sent\n", sbuf.mtext);

    exit(0);
}

You aren't linking with the library that contains the msgsnd and msgget functions, so your linker step fails. I'm not familiar with Minix so I'm not sure where the library is stored or what it is called. Basically, you need to a -l<msg> flag to your linking step. Where <msg> is the name of the library that contains the implementation.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM