Можно ли создавать расширения sqlite на Apple Silicon с помощью clang?

Я пытаюсь создать расширение sqlite процентиля на ноутбуке M1, используя инструкции на странице:

gcc -g -fPIC -shared percentile.c -o percentile.so

Однако это приводит к следующим ошибкам из clang:

$ gcc -g -fPIC -shared percentile.c -o percentile.so
Undefined symbols for architecture arm64:
  "_sqlite3_aggregate_context", referenced from:
      _percentStep in percentile-a11598.o
      _percentFinal in percentile-a11598.o
  "_sqlite3_create_function", referenced from:
      _sqlite3_percentile_init in percentile-a11598.o
      _sqlite3_percentile_init in percentile-a11598.o
      _sqlite3_percentile_init in percentile-a11598.o
  "_sqlite3_free", referenced from:
      _percentStep in percentile-a11598.o
      _percentFinal in percentile-a11598.o
  "_sqlite3_realloc64", referenced from:
      _percentStep in percentile-a11598.o
  "_sqlite3_result_double", referenced from:
      _percentFinal in percentile-a11598.o
  "_sqlite3_result_error", referenced from:
      _percentStep in percentile-a11598.o
      _percentStep in percentile-a11598.o
      _percentStep in percentile-a11598.o
      _percentStep in percentile-a11598.o
      _percentStep in percentile-a11598.o
  "_sqlite3_result_error_nomem", referenced from:
      _percentStep in percentile-a11598.o
  "_sqlite3_user_data", referenced from:
      _percentStep in percentile-a11598.o
  "_sqlite3_value_double", referenced from:
      _percentStep in percentile-a11598.o
      _percentStep in percentile-a11598.o
      _percentStep in percentile-a11598.o
  "_sqlite3_value_numeric_type", referenced from:
      _percentStep in percentile-a11598.o
      _percentStep in percentile-a11598.o
  "_sqlite3_value_type", referenced from:
      _percentStep in percentile-a11598.o
ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

Можно ли создавать расширения sqlite с помощью clang, или мне нужен настоящий GCC, чтобы это работало?

Ваш вопрос противоречив, поскольку вы говорите, что строите с помощью clang, но ошибки относятся к gcc. В Linux он собирается без ошибок с помощью clang или gcc.

Allan Wind 23.08.2024 08:27

@AllanWind Версия clang от Apple поставляется со сценарием gcc, который запускает clang. Очень запутанно и раздражает.

Shawn 23.08.2024 17:02

Можете ли вы попробовать это? gcc -g -fPIC -dynamiclib percentile.c -percentile.dylib

Allan Wind 23.08.2024 18:40

@AllanWind Та же ошибка. Кроме того, да, когда я вызываю gcc, это на самом деле clang по умолчанию в MacOS.

merlin2011 23.08.2024 19:26

На случай, если вы не знаете, вы можете легко установить GCC с помощью доморощенного продукта, используя brew install gcc.

Mark Setchell 23.08.2024 19:35

Я ничего не знаю о MacOS, но думаю, что это проблема сборки, а не проблема с компилятором. Не помешало бы добавить тег для вашей ОС. Символы, на которые он жалуется, являются частью API sqlite3, и с моим расширением они разрешаются при загрузке sqlite3. Может быть, на MacOS все по-другому? В Linux есть libsqlite3.so, может быть, попробуйте добавить -lsqlite3 в команду сборки?

Allan Wind 23.08.2024 21:02

Попробуйте добавить -lsqlite3 в конце команды компиляции.

l'L'l 24.08.2024 06:17
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
7
57
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

После долгих экспериментов у меня получилось кое-что, что работает. Нужная вам команда больше похожа на следующую, поскольку в macOS библиотеки общих объектов заканчиваются на .dylib:

gcc -g -fPIC -dynamiclib -undefined suppress percentile.c -o percentile.dylib

хотя оно выдает предупреждение ld: warning: -undefined suppress is deprecated, с которым может помочь кто-то умнее меня (их много).

Однако при попытке загрузить его произойдет ошибка, если вы используете предоставленную Apple команду sqlite3 в /usr/bin/sqlite3. Вы можете узнать, какой из них вы используете, запустив:

type sqlite3
sqlite3 is /usr/bin/sqlite3

При попытке загрузить его вы получаете:

sqlite> .load percentile
Error: unknown command or invalid arguments:  "load". Enter ".help" for help

Если вы затем проверите, как Apple компилирует sqlite3 с помощью:

sqlite3 :memory: 'select * from pragma_compile_options()'

Выход

ATOMIC_INTRINSICS=1
BUG_COMPATIBLE_20160819
CCCRYPT256
COMPILER=clang-15.0.0
DEFAULT_AUTOVACUUM
DEFAULT_CACHE_SIZE=2000
DEFAULT_CKPTFULLFSYNC
DEFAULT_FILE_FORMAT=4
DEFAULT_JOURNAL_SIZE_LIMIT=32768
DEFAULT_LOOKASIDE=1200,102
...
...
MAX_TRIGGER_DEPTH=1000
MAX_VARIABLE_NUMBER=500000
MAX_VDBE_OP=250000000
MAX_WORKER_THREADS=8
MUTEX_UNFAIR
OMIT_AUTORESET
OMIT_LOAD_EXTENSION                  <--- OOPS, ".load" not built in
STMTJRNL_SPILL=131072
SYSTEM_MALLOC
TEMP_STORE=1
THREADSAFE=2
USE_URI

Вы можете видеть, что Apple не разрешает команду .load. Итак, вам нужно либо собрать весь sqlite3 самостоятельно (разумеется, без OMIT_LOAD_EXTENSION), либо использовать доморощенный вариант для установки их исполняемого файла:

brew install sqlite

Затем вы можете запустить:

/opt/homebrew/Cellar/sqlite/3.46.0/bin/sqlite3 :memory: 'select * from pragma_compile_options()'

и вы увидите, что команда .load поддерживается. Теперь вы можете сделать:

/opt/homebrew/Cellar/sqlite/3.46.0/bin/sqlite3
sqlite> .load percentile
sqlite> 

Обратите внимание, что я использовал /opt/homebrew/Cellar/sqlite/3.46.0/bin/sqlite3, тогда как вам следует использовать "$(brew --prefix)/Cellar/sqlite/3.46.0/bin/sqlite3" более правильно, потому что это будет работать на компьютерах Intel Mac (которые используют /usr/local/Cellar), а также Apple Silicon (которые используют /opt/homebrew/Cellar).

уууу... Я устал просто читать твой потрясающий ответ! Слава вам!!

pmg 24.08.2024 11:43

Другие вопросы по теме