Я пытаюсь заставить 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()
звонить? Если бы я мог бы сделать это, я думаю, что это удовлетворило бы мои потребности.
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
наборы флаги передаются команде ссылки.
env_2.SharedLibrary('libstuff.so', Split("""stuff.cxx"""), LIBS='libMine.a', LIBPATH='mylib')
Это должно работать.
У меня такая же проблема под cygwin. Я передал gcc параметры '-fPIC' при построении объектов и получил следующее предупреждение:
предупреждение: -fPIC игнорируется для цели (весь код не зависит от позиции)
Я также передал '-shared' команде ссылки . И я наконец получил ошибку
«***. Lib статичен и несовместим с разделяемой целью: myso.dll»
Кажется, scons не позволяет создавать так напрямую из файлов obj или lib, и так можно создать либо из списка исходных файлов (с помощью SharedLibrary ()), либо из исходного файла + параметр «LIBS», как говорит dummytaurus. Мне любопытно об этом.