не может связаться с библиотекой stati c mysqlclient, хотя общая библиотека работает - PullRequest
0 голосов
/ 22 февраля 2020

У меня есть пример программы для ознакомления с API mysqlclient. Однако, когда я статически компилирую и связываю его с библиотекой mysqlclient (.a файл), компоновщик жалуется, что не может найти файл, хотя он существует в моем пути. Ссылка на общую библиотеку (файл .dylib на моем Ma c) работает. Пожалуйста, помогите мне разобраться в этом поведении. Очень признателен!

Вот моя драйверная программа client.c, которая вызывает библиотеку mysqlclient.

#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;
}

Вот как я его скомпилирую

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)

Компиляция без .a завершается успешно, так как она ссылается на общую библиотеку, а не на stati c one.

Наконец, вот мои файлы библиотеки:

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

1 Ответ

0 голосов
/ 22 февраля 2020

Этот аргумент:

 -l mysqlclient.a

заставляет компоновщик искать файл с именем libmysqlclient.a.a. Вместо этого вы хотите что-то вроде:

gcc -I /usr/local/Cellar/mysql/8.0.16/include/mysql client.c /usr/local/Cellar/mysql/8.0.16/lib/mysqlclient.a
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...