【问题标题】:Cannot link sctp binary无法链接 sctp 二进制文件
【发布时间】:2015-11-25 09:53:03
【问题描述】:

我正在做一个网络C 库,我也想支持SCTP。 我在这个文件中有 wrapper_socket_functions.c

/*SCTP WRAPPER */
void
Sctp_bindx(int sd, struct sockaddr *addrs, int addrcnt, int flags)
{
    int rbindx = sctp_bindx(sd, addrs, addrcnt, flags);
    if(rbindx == -1)
        prog_error("Sctp_bindx error",true,errno);
}
void
Sctp_connectx(int sd, struct sockaddr *addrs, int addrcnt, sctp_assoc_t *id)
{
    int rconnectx = sctp_connectx(sd, addrs, addrcnt, id);
    if(rconnectx == -1)
        prog_error("Sctp_connectx error",true,errno);
}
int
Sctp_peeloff(int sd, sctp_assoc_t assoc_id)
{
    int rpeeloff = sctp_peeloff(sd, assoc_id);
    if(rpeeloff == -1)
        prog_error("Sctp_paleof error",true,errno);
    return rpeeloff;
}

我有这个makefile。

CC = gcc
CFLAGS = -lsctp -c -std=gnu11 -g -Wall -o
LIB_PATH = lib/
BIN_PATH = bin/

OBJECTS_LIBRARY = bin/error.o bin/signal.o bin/io_socket.o bin/wrapper_socket_functions.o bin/wrapper_stdio.o bin/wrapper_convert.o bin/wrapper_io_socket.o bin/wrapper_unix.o bin/handlers.o bin/miscellaneous.o bin/protocol.o
CLIENT_FILES = bin/client.o
SERVER_FILES = bin/server.o

all:

    #Compile MAIN_FILES

    $(CC) $(CFLAGS) $(BIN_PATH)client.o client.c
    $(CC) $(CFLAGS) $(BIN_PATH)server.o server.c

    #Compile LIB_FILES

    $(CC) $(CFLAGS) $(BIN_PATH)handlers.o $(LIB_PATH)handlers.c
    $(CC) $(CFLAGS) $(BIN_PATH)signal.o $(LIB_PATH)signal.c
    $(CC) $(CFLAGS) $(BIN_PATH)error.o $(LIB_PATH)error.c
    $(CC) $(CFLAGS) $(BIN_PATH)wrapper_socket_functions.o $(LIB_PATH)wrapper_socket_functions.c
    $(CC) $(CFLAGS) $(BIN_PATH)wrapper_stdio.o $(LIB_PATH)wrapper_stdio.c
    $(CC) $(CFLAGS) $(BIN_PATH)wrapper_convert.o $(LIB_PATH)wrapper_convert.c
    $(CC) $(CFLAGS) $(BIN_PATH)wrapper_io_socket.o $(LIB_PATH)wrapper_io_socket.c
    $(CC) $(CFLAGS) $(BIN_PATH)io_socket.o $(LIB_PATH)io_socket.c
    $(CC) $(CFLAGS) $(BIN_PATH)wrapper_unix.o $(LIB_PATH)wrapper_unix.c
    $(CC) $(CFLAGS) $(BIN_PATH)miscellaneous.o $(LIB_PATH)miscellaneous.c
    $(CC) $(CFLAGS) $(BIN_PATH)protocol.o $(LIB_PATH)protocol.c
    #Link CLIENT

    $(CC) -o $(BIN_PATH)client $(OBJECTS_LIBRARY) $(CLIENT_FILES)

    #Link SERVER

    $(CC) -o $(BIN_PATH)server $(OBJECTS_LIBRARY) $(SERVER_FILES)

    #Remove unwanted objects

    rm -rf bin/*.o

问题是当我在两个不同的 bin serverclient 中将它们链接在一起时,它告诉我:

undefined reference to sctp_bindx undefined reference to sctp_connectx undefined reference to sctp_peeloff

请注意,当我使用 -lsctp 编译时,它编译得很好,但是当我尝试链接该 *.o 文件时,它会像上面一样抱怨。我还安装了 lksctp_tools 并使用 checksctp

检查我的内核是否支持它
~ $ checksctp
Sctp supported

【问题讨论】:

  • 链接器库应始终放在最后,在所有依赖于库的目标文件之后。
  • 我试过了,但还是报错..
  • 可能是因为您在链接时没有使用任何标志?
  • 顺便说一句,这是一个非常奇怪的 makefile,通常使用规则,因此您不必编译/链接未更改的文件,而不是像您一样总是重建所有内容。
  • Joachim Pileborg,它现在可以工作了!非常感谢!

标签: c linux sockets network-programming sctp


【解决方案1】:

删除CFLAGS arg -lsctp 并将其添加到LINKFLAGS = -lsctp 和链接时在$(CC) $(LINKFLAGS). 之后添加

【讨论】:

  • 按照惯例,你叫LDFLAGS你叫LINKFLAGS
猜你喜欢
  • 1970-01-01
  • 2015-02-27
  • 2016-10-19
  • 1970-01-01
  • 1970-01-01
  • 2018-02-02
  • 2014-08-13
  • 1970-01-01
  • 2014-05-09
相关资源
最近更新 更多