Связывание со статически скомпилированным z3 требует дополнительных библиотек в Linux

Я использовал CMake для компиляции статической версии (довольно недавней) z3, используя:

cmake -DBUILD_LIBZ3_SHARED=false -DCMAKE_INSTALL_PREFIX=/opt/z3-devel -G "Unix Makefiles" ../

Теперь, когда я статически свяжу библиотеку с программой на C++, скажите, что это небольшая вариация примера z3:

#include"z3++.h"
using namespace z3;

int main(int argc, char** argv) {
  config conf;
  context c(conf);
  expr x = c.int_const("x");
  expr y = c.int_const("y");
  expr z = c.int_const("z");
  goal g(c);
  g.add( ((2*x)+y)+z == 4);
  g.add( (x+(2*y))+z == 4);
  g.add( x+y == 4);
  std::cout << g << "\n";
  tactic t(c, "fm");
  apply_result r = t(g);
  std::cout << r << "\n";
  return 0;
}

через

g++ -c -I /opt/z3-devel/include -static -o main.o main.cc
g++ -static -L /opt/z3-devel/lib64 -o main main.o -lz3

Я получаю длинный список ошибок привязки неопределенных ссылок. Что решает проблему, так это добавить -lgomp -pthread -lrt -ldl в качестве дополнительных библиотек. Компоновщик выводит следующее предупреждение:

/usr/bin/ld: /usr/lib/gcc/x86_64-redhat-linux/8/libgomp.a(target.o): in function `gomp_target_init':
(.text+0x32c): warning: Using 'dlopen' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking

Тем не менее, программа отлично работает на моей машине и на Starexec.

Является ли эта комбинация статических и динамических ссылок лучшим, что я могу сделать? Разве эти библиотеки не должны быть уже статически связаны с libz3.a? У меня есть статические версии gomp, pthread и rt, доступные в системе.

Одна немедленная мысль: я помню, что по крайней мере в Windows OpenMP недоступен в статической форме, поэтому скрипты сборки могут быть настроены на использование динамических библиотек независимо от цели. Судя по предупреждающему сообщению от компоновщика, на вашей платформе оно похоже.

Christoph Wintersteiger 28.03.2019 18:45

Это вполне возможно — если я правильно понимаю флаг cmake, это просто выражает предпочтение статических библиотек перед динамическими. Тогда может иметь смысл поднять вопрос в репозитории github — я просто хочу убедиться, что это не конкретная проблема, которая возникает только у меня.

lambda.xy.x 28.03.2019 18:56
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать 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
2
261
0

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