Closed
Description
I create vs2019 project file with this command:
cmake .
then build the project hiredis in vs2019, the .dll file is created, but .lib file is missed.
I SOLVED the issue: add new compilation parameter 'HIREDIS_LIB_EXPORTS', modify the source:
diff --git a/hiredis.h b/hiredis.h
index 1ae1c0a..ea321bc 100644
--- a/hiredis.h
+++ b/hiredis.h
@@ -31,6 +31,18 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
+
+#ifdef _WIN32
+#ifdef HIREDIS_LIB_EXPORTS
+#define HIREDIS_API __declspec(dllexport)
+#else
+#define HIREDIS_API __declspec(dllimport)
+#endif
+#else
+#define HIREDIS_API
+#endif
+
+
#ifndef __HIREDIS_H
#define __HIREDIS_H
#include "read.h"
@@ -107,18 +119,18 @@ typedef struct redisReply {
struct redisReply **element; /* elements vector for REDIS_REPLY_ARRAY */
} redisReply;
-redisReader *redisReaderCreate(void);
+HIREDIS_API redisReader *redisReaderCreate(void);
/* Function to free the reply objects hiredis returns by default. */
-void freeReplyObject(void *reply);
+HIREDIS_API void freeReplyObject(void *reply);
/* Functions to format a command according to the protocol. */
-int redisvFormatCommand(char **target, const char *format, va_list ap);
-int redisFormatCommand(char **target, const char *format, ...);
-int redisFormatCommandArgv(char **target, int argc, const char **argv, const size_t *argvlen);
-int redisFormatSdsCommandArgv(sds *target, int argc, const char ** argv, const size_t *argvlen);
-void redisFreeCommand(char *cmd);
-void redisFreeSdsCommand(sds cmd);
+HIREDIS_API int redisvFormatCommand(char **target, const char *format, va_list ap);
+HIREDIS_API int redisFormatCommand(char **target, const char *format, ...);
+HIREDIS_API int redisFormatCommandArgv(char **target, int argc, const char **argv, const size_t *argvlen);
+HIREDIS_API int redisFormatSdsCommandArgv(sds *target, int argc, const char ** argv, const size_t *argvlen);
+HIREDIS_API void redisFreeCommand(char *cmd);
+HIREDIS_API void redisFreeSdsCommand(sds cmd);
enum redisConnectionType {
REDIS_CONN_TCP,
@@ -221,24 +233,24 @@ typedef struct redisContext {
} redisContext;
-redisContext *redisConnectWithOptions(const redisOptions *options);
-redisContext *redisConnect(const char *ip, int port);
-redisContext *redisConnectWithTimeout(const char *ip, int port, const struct timeval tv);
-redisContext *redisConnectNonBlock(const char *ip, int port);
-redisContext *redisConnectBindNonBlock(const char *ip, int port,
+HIREDIS_API redisContext *redisConnectWithOptions(const redisOptions *options);
+HIREDIS_API redisContext *redisConnect(const char *ip, int port);
+HIREDIS_API redisContext *redisConnectWithTimeout(const char *ip, int port, const struct timeval tv);
+HIREDIS_API redisContext *redisConnectNonBlock(const char *ip, int port);
+HIREDIS_API redisContext *redisConnectBindNonBlock(const char *ip, int port,
const char *source_addr);
-redisContext *redisConnectBindNonBlockWithReuse(const char *ip, int port,
+HIREDIS_API redisContext *redisConnectBindNonBlockWithReuse(const char *ip, int port,
const char *source_addr);
-redisContext *redisConnectUnix(const char *path);
-redisContext *redisConnectUnixWithTimeout(const char *path, const struct timeval tv);
-redisContext *redisConnectUnixNonBlock(const char *path);
-redisContext *redisConnectFd(redisFD fd);
+HIREDIS_API redisContext *redisConnectUnix(const char *path);
+HIREDIS_API redisContext *redisConnectUnixWithTimeout(const char *path, const struct timeval tv);
+HIREDIS_API redisContext *redisConnectUnixNonBlock(const char *path);
+HIREDIS_API redisContext *redisConnectFd(redisFD fd);
/**
* Secure the connection using SSL. This should be done before any command is
* executed on the connection.
*/
-int redisSecureConnection(redisContext *c, const char *capath, const char *certpath,
+HIREDIS_API int redisSecureConnection(redisContext *c, const char *capath, const char *certpath,
const char *keypath, const char *servername);
/**
@@ -250,40 +262,40 @@ int redisSecureConnection(redisContext *c, const char *capath, const char *certp
*
* Returns REDIS_OK on successful connect or REDIS_ERR otherwise.
*/
-int redisReconnect(redisContext *c);
+HIREDIS_API int redisReconnect(redisContext *c);
-int redisSetTimeout(redisContext *c, const struct timeval tv);
-int redisEnableKeepAlive(redisContext *c);
-void redisFree(redisContext *c);
-redisFD redisFreeKeepFd(redisContext *c);
-int redisBufferRead(redisContext *c);
-int redisBufferWrite(redisContext *c, int *done);
+HIREDIS_API int redisSetTimeout(redisContext *c, const struct timeval tv);
+HIREDIS_API int redisEnableKeepAlive(redisContext *c);
+HIREDIS_API void redisFree(redisContext *c);
+HIREDIS_API redisFD redisFreeKeepFd(redisContext *c);
+HIREDIS_API int redisBufferRead(redisContext *c);
+HIREDIS_API int redisBufferWrite(redisContext *c, int *done);
/* In a blocking context, this function first checks if there are unconsumed
* replies to return and returns one if so. Otherwise, it flushes the output
* buffer to the socket and reads until it has a reply. In a non-blocking
* context, it will return unconsumed replies until there are no more. */
-int redisGetReply(redisContext *c, void **reply);
-int redisGetReplyFromReader(redisContext *c, void **reply);
+HIREDIS_API int redisGetReply(redisContext *c, void **reply);
+HIREDIS_API int redisGetReplyFromReader(redisContext *c, void **reply);
/* Write a formatted command to the output buffer. Use these functions in blocking mode
* to get a pipeline of commands. */
-int redisAppendFormattedCommand(redisContext *c, const char *cmd, size_t len);
+HIREDIS_API int redisAppendFormattedCommand(redisContext *c, const char *cmd, size_t len);
/* Write a command to the output buffer. Use these functions in blocking mode
* to get a pipeline of commands. */
-int redisvAppendCommand(redisContext *c, const char *format, va_list ap);
-int redisAppendCommand(redisContext *c, const char *format, ...);
-int redisAppendCommandArgv(redisContext *c, int argc, const char **argv, const size_t *argvlen);
+HIREDIS_API int redisvAppendCommand(redisContext *c, const char *format, va_list ap);
+HIREDIS_API int redisAppendCommand(redisContext *c, const char *format, ...);
+HIREDIS_API int redisAppendCommandArgv(redisContext *c, int argc, const char **argv, const size_t *argvlen);
/* Issue a command to Redis. In a blocking context, it is identical to calling
* redisAppendCommand, followed by redisGetReply. The function will return
* NULL if there was an error in performing the request, otherwise it will
* return the reply. In a non-blocking context, it is identical to calling
* only redisAppendCommand and will always return NULL. */
-void *redisvCommand(redisContext *c, const char *format, va_list ap);
-void *redisCommand(redisContext *c, const char *format, ...);
-void *redisCommandArgv(redisContext *c, int argc, const char **argv, const size_t *argvlen);
+HIREDIS_API void *redisvCommand(redisContext *c, const char *format, va_list ap);
+HIREDIS_API void *redisCommand(redisContext *c, const char *format, ...);
+HIREDIS_API void *redisCommandArgv(redisContext *c, int argc, const char **argv, const size_t *argvlen);
#ifdef __cplusplus
}
Metadata
Metadata
Assignees
Labels
No labels
Activity