Daniel
Daniel

Reputation: 1574

cannot link to static mysqlclient library, though shared library works

I have a sample program to familiarize myself with mysqlclient APIs. However when I compile and link it to the mysqlclient library statically (.a file), the linker complains it cannot find the file, although it exists in my path. Linking to the shared library (.dylib file on my Mac) works. Please help me get my head around this behaviour. Much appreciated!

Here's my driver program client.c that calls mysqlclient library.

#include <stdlib.h>
#include <stdio.h>
#include <string.h>

#include <mysql.h>

int main(int argc, char **argv) 
{
  MYSQL *mysql = NULL;

  if (mysql_library_init(argc, argv, NULL)) {
    fprintf(stderr, "could not initialize MySQL client library\n");
    exit(1);
  }

  mysql = mysql_init(mysql);

  if (!mysql) {
    puts("Init faild, out of memory?");
    return EXIT_FAILURE;
  }

  if (!mysql_real_connect(mysql,       /* MYSQL structure to use */
              NULL,         /* server hostname or IP address */ 
              NULL,         /* mysql user */
              NULL,          /* password */
              NULL,               /* default database to use, NULL for none */
              0,           /* port number, 0 for default */
              NULL,        /* socket file or named pipe name */
              CLIENT_FOUND_ROWS /* connection flags */ )) {
    puts("Connect failed\n");
  } else {                
    const char *query = "SELECT VERSION()";
    if (mysql_real_query(mysql, query, strlen(query))) {
      printf("Query failed: %s\n", mysql_error(mysql));
    } else {
      puts("Query OK");
    }
  }

  mysql_close(mysql);

  mysql_library_end();

  return EXIT_SUCCESS;
}

Here's how I compile it

gcc -I /usr/local/Cellar/mysql/8.0.16/include/mysql client.c -L /usr/local/Cellar/mysql/8.0.16/lib/ -l mysqlclient.a
ld: library not found for -lmysqlclient.a
clang: error: linker command failed with exit code 1 (use -v to see invocation)

Compiling without the .a succeeds, as it links to the shared library, not static one.

Lastly, here's my library files:

ls /usr/local/Cellar/mysql/8.0.16/lib/libmysqlclient*
/usr/local/Cellar/mysql/8.0.16/lib/libmysqlclient.21.dylib /usr/local/Cellar/mysql/8.0.16/lib/libmysqlclient.a        /usr/local/Cellar/mysql/8.0.16/lib/libmysqlclient.dylib

Upvotes: 0

Views: 1189

Answers (2)

harryhare
harryhare

Reputation: 43

-lmysqlclient should work. The extension .a does not need.

When you want to use static link, --static should be used.

You may also need to link other libraries

gcc client.c -o client --static  -lmysqlclient  -lssl -lcrypto -ldl  -lpthread

Upvotes: 2

Employed Russian
Employed Russian

Reputation: 213754

This argument:

 -l mysqlclient.a

causes the linker to look for a file named libmysqlclient.a.a. Instead, you want something like:

gcc -I /usr/local/Cellar/mysql/8.0.16/include/mysql client.c /usr/local/Cellar/mysql/8.0.16/lib/mysqlclient.a

Upvotes: 1

Related Questions