SCons для создания общей библиотеки (.so) со статической библиотекой (.a)

Я пытаюсь заставить SCons делать общую библиотеку. Один из объектов, входящих .so a .a статический lib.

У меня есть строка как:

env_2.SharedLibrary('libstuff.so', \
  Split("""stuff.cxx mylib/libMine.a""")

И после выполнения его, я получаю эту ошибку:

scons: *** Source file: mylib/libMine.a \
is static and is not compatible with shared target: libstuff.so

Однако я знаю, что общая библиотека может быть сделана из .a через команду как:

g++ -m32 -shared -o libstuff.so stuff.o mylib/libMine.a

Любые идеи заставить это работать или любые обходные решения значительно ценились бы.


Связанный вопрос: Как я заставляю сканирования помещать дополнительную строку -shared на командной строке ССЫЛКИ для Program() звонить? Если бы я мог бы сделать это, я думаю, что это удовлетворило бы мои потребности.

9
задан RzR 13 May 2016 в 20:44
поделиться

3 ответа

public event EventHandler ImageFullPath1Changed;

public string ImageFullPath1
{
    get
    {
        // insert getter logic
    }
    set
    {
        // insert setter logic       

        // EDIT -- this example is not thread safe -- do not use in production code
        if (ImageFullPath1Changed != null && value != _backingField)
            ImageFullPath1Changed(this, new EventArgs(/*whatever*/);
    }
}                        

Я полностью согласен с Райаном. Именно поэтому существует INotifyPropertyChanged.

-121--940016-

При изменении свойства на «back field» (вместо «automatic property») можно выполнить следующие действия:

public event EventHandler ImageFullPath1Changed;
private string _imageFullPath1 = string.Empty;

public string ImageFullPath1 
{
  get
  {
    return imageFullPath1 ;
  }
  set
  {
    if (_imageFullPath1 != value)
    { 
      _imageFullPath1 = value;

      EventHandler handler = ImageFullPathChanged;
      if (handler != null)
        handler(this, e);
    }
  }
}
-121--940017-

Эта проблема не относится к сконам. Для создания общей библиотеки потребуются объекты, скомпилированные с позицией независимым кодом ( -fPIC ). Лучше всего сделать общую библиотеку из исходных файлов, скомпилированных с нужными параметрами.

В SCons можно определить список целей, используемых для построения как libMine.a, так и libShared.so.


Обновление : для второго вопроса построитель SharedLibrary может выполнить необходимые действия:

SharedLibrary('foo', ['f1.c', 'f2.c', 'f3.c'])

Если нет, LINKFLAGS наборы флаги передаются команде ссылки.

2
ответ дан 4 December 2019 в 15:18
поделиться
env_2.SharedLibrary('libstuff.so', Split("""stuff.cxx"""), LIBS='libMine.a', LIBPATH='mylib')

Это должно работать.

0
ответ дан 4 December 2019 в 15:18
поделиться

У меня такая же проблема под cygwin. Я передал gcc параметры '-fPIC' при построении объектов и получил следующее предупреждение:

предупреждение: -fPIC игнорируется для цели (весь код не зависит от позиции)

Я также передал '-shared' команде ссылки . И я наконец получил ошибку

«***. Lib статичен и несовместим с разделяемой целью: myso.dll»

Кажется, scons не позволяет создавать так напрямую из файлов obj или lib, и так можно создать либо из списка исходных файлов (с помощью SharedLibrary ()), либо из исходного файла + параметр «LIBS», как говорит dummytaurus. Мне любопытно об этом.

0
ответ дан 4 December 2019 в 15:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: