GCC / C ++ Статическое связывание для заголовков в общем объекте - PullRequest
1 голос
/ 09 июня 2010

-Я пытаюсь создать общий объект libfoo.so. libfoo.so создан из foo.c - Предположим, что я включаю заголовки static.h и Dynamic.h, где я хочу, чтобы компилятор
разрешите символы для Static.h и оставьте остальные, т.е. из Dynamic.h для выполнения. - Как мне это сделать ? Какие параметры CFLAG и LDFLAG мне нужно передать. - Мой make-файл настроен для создания общего объекта с использованием CFLAGS = fPIC, shared, W1, export-dynamic. - Во включаемых путях я Укажите правильное местоположение для "Static.h"

Может ли кто-нибудь мне помочь?

Ответы [ 3 ]

1 голос
/ 10 июня 2010

dlopen (), dlclose (), dlsym (), dlerror () предназначены для открытия внешних библиотек времени выполнения. Вы должны объявить указатели функций на эти внешние объекты, а затем разрешить их во время выполнения.

Если вы просто оставите ссылки «голыми» в коде, компоновщик попытается разрешить символ. Он либо разрешит проблему, либо выдаст ошибку, если вы не получите образ исполняемого файла. Я не знаю каких-либо опций компоновщика, исключающих попытки связать неразрешенные символы.

Или я не понимаю, что вы пытаетесь сделать.

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

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

Вы также можете связать свое приложение с библиотекой (вместоиспользование libdl, что является трудной задачей для отслеживания зависимостей lib с помощью многих распространенных инструментов сборки / анализа).Для этого достаточно использовать -shared и not -static в вашем CFLAGS.

Многие проекты определяют частные и открытые API и поля, хотя в C для библиотек все же.Может быть, это то, что вы должны сделать, чтобы решить эту проблему?

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

Я полагаю, что функциональность, которую вы описываете, - это то, что вы получаете бесплатно с компоновщиком GCC.В процессе компоновки компоновщик разрешит все символы, которые ваш код ссылается на библиотеки, переданные ему в командной строке.Если упомянутое имя символа содержится в статической библиотеке (файл .a), он будет «статически» связан, а если символ вместо этого находится в библиотеке динамических ссылок (файл .so), он будет динамически связан в программевремя выполнения.

Вообще говоря, вам не нужно заботиться о том, статически или динамически связаны ваши символы, так как это не должно иметь никакого влияния на ваш код C / C ++.Из вашего описания трудно понять мотивацию вашего вопроса, но есть вероятность, что вам может понадобиться явная загрузка библиотеки динамических ссылок через системный вызов dlopen().Если первый абзац не отвечает на ваш вопрос, не могли бы вы описать общую проблему, которую вы пытаетесь решить?

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