SCons для создания общей библиотеки (.so) со статической библиотекой (.a) - PullRequest
9 голосов
/ 11 февраля 2010

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

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

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

Любые идеи о том, как заставить это работать, или любые обходные путис благодарностью.


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

Ответы [ 6 ]

10 голосов
/ 02 ноября 2010

Попробуйте установить env['STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME']=1 в вашей SConstruct.

1 голос
/ 11 февраля 2010

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

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


Обновление : для вашего второго вопроса сборщик SharedLibrary может сделать то, что вам нужно:

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

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

0 голосов
/ 30 июля 2018

Для решения этой проблемы использовался SharedObject:

ASN1CObjectFile = envCProcesses.SharedObject(target = "OTCMsg.os",
                                             source = "OTCMsg.c",
                                             CFLAGS = envCProcesses["CFLAGS"] + ["-Wno-unused"])

и

OTCLibSharedLibrary = envCProcesses.SharedLibrary(env["OTC_LIBPATH"] + "/libOTCLib" + env["SHLIBSUFFIX"],
                                              ASN1CObjectFile +
                                              [ASN1AllocatorSource,
                                               "OTCLib.c"],
                                              LIBPREFIX = "")

С уважением,

0 голосов
/ 24 февраля 2013

Проблема в функции SharedFlagChecker (Default.py), которая проверяет только внутренний «общий» флаг. Документация SCons заставляет вас думать, что она сохраняет различие между общими объектами и статическими объектами через суффикс (SHOBJSUFFIX), но не так. Исправить легко. В файле scons-local.../SCons/Default.py найдите SharedFlagChecker и отредактируйте:

def SharedFlagChecker(source, target, env):
    same = env.subst('$STATIC_AND_SHARED_OBJECTS_ARE_THE_SAME')
    if same == '0' or same == '' or same == 'False':
        for src in source:
            try:
                shared = src.attributes.shared
            except AttributeError:
                # Replace this line: shared = None
                shared = env.Dictionary()['SHOBJSUFFIX'] == src.suffix
            if not shared:
                raise SCons.Errors.UserError("Source file: ...") 

Теперь объекты, созданные с помощью компоновщика SharedObject, будут связаны в общей библиотеке.

0 голосов
/ 20 июня 2010

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

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

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

"***. Lib статичен и не совместим с общей целью: myso.dll"

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

0 голосов
/ 24 февраля 2010
env_2.SharedLibrary('libstuff.so', Split("""stuff.cxx"""), LIBS='libMine.a', LIBPATH='mylib')

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...