2
我在庫中創建了一個與socklen_t衝突的typedef,並試圖從ndk-path/platforms/android-19/arch-arm/usr中創建一個包含的文件/include/sys/socket.h。在sys/socket.h中將socklen_t int更改爲uint32_t
該庫有typedef uint32_t socklen_t
,但包含sys/socket.h類型將其定義爲int。我可以讓庫使用sys/socket.h版本(int)或者在socket.h頭文件中重新定義它(如下所示)。哪個更安全?我試圖聯繫圖書館的作者,但沒有迴應。是否正在改變socket.h中的定義安全?
#ifndef _SYS_SOCKET_H_
#define _SYS_SOCKET_H_
#include <sys/cdefs.h>
#include <sys/types.h>
#include <cstdint>
#include <linux/socket.h>
__BEGIN_DECLS
#define SOCK_STREAM 1
#define SOCK_DGRAM 2
#define SOCK_RAW 3
#define SOCK_RDM 4
#define SOCK_SEQPACKET 5
#define SOCK_PACKET 10
#ifdef __i386__
# define __socketcall extern __attribute__((__cdecl__))
#else
# define __socketcall extern
#endif
/* BIONIC: second argument to shutdown() */
enum {
SHUT_RD = 0, /* no more receptions */
#define SHUT_RD SHUT_RD
SHUT_WR, /* no more transmissions */
#define SHUT_WR SHUT_WR
SHUT_RDWR /* no more receptions or transmissions */
#define SHUT_RDWR SHUT_RDWR
};
typedef uint32_t socklen_t;
__socketcall int socket(int, int, int);
__socketcall int bind(int, const struct sockaddr *, int);
__socketcall int connect(int, const struct sockaddr *, socklen_t);
__socketcall int listen(int, int);
__socketcall int accept(int, struct sockaddr *, socklen_t *);
__socketcall int getsockname(int, struct sockaddr *, socklen_t *);
__socketcall int getpeername(int, struct sockaddr *, socklen_t *);
__socketcall int socketpair(int, int, int, int *);
__socketcall int shutdown(int, int);
__socketcall int setsockopt(int, int, int, const void *, socklen_t);
__socketcall int getsockopt(int, int, int, void *, socklen_t *);
__socketcall int sendmsg(int, const struct msghdr *, unsigned int);
__socketcall int recvmsg(int, struct msghdr *, unsigned int);
extern ssize_t send(int, const void *, size_t, unsigned int);
extern ssize_t recv(int, void *, size_t, unsigned int);
__socketcall ssize_t sendto(int, const void *, size_t, int, const struct sockaddr *, socklen_t);
__socketcall ssize_t recvfrom(int, void *, size_t, unsigned int, const struct sockaddr *, socklen_t *);
#undef __socketcall
__END_DECLS
#endif /* _SYS_SOCKET_H */
您需要匹配庫編譯時認爲'socklen_t'的任何內容,否則您將得到未解析的符號鏈接器錯誤。如果你確實改變了某些東西,它可能必須放在那個庫中,你需要重新編譯它。 –
你確定你應該包含這個文件,而不僅僅是正常的「socket.h」嗎? – EJP