Skip to content

Cannot generate .lib file in vs2019 #687

Closed
@cy-chengyan

Description

@cy-chengyan

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
 }

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions