C++, Как получить имя файла (и путь) выполнения .so модуль в Unix?
Что-то подобное GetModuleFileName в Windows.
Хотя это не стандартный интерфейс POSIX, dladdr () Функция
доступна во многих системах, включая Linux , Solaris , Darwin / Mac OS X , FreeBSD , HP -UX и IRIX . Эта функция принимает адрес, который может быть, например, указателем на статическую функцию в модуле (если приведен к void *
), и заполняет структуру Dl_info
информацией, включая путь к общему объекту, содержащему этот адрес (в элементе dli_fname
).
Возможные решения:
/ proc / {PID} / mmap
. Где {PID} - это идентификатор процесса (его можно получить с помощью getpid ()
). ldd
для двоичного файла программы (хранящегося в argv [0]
). ldd
из uClibc
, как получить список общих библиотек из двоичного файла elf. К сожалению, это невозможно сделать с помощью UNIX или POSIX. Если вам нужно использовать его для поиска каких-либо данных, вы должны использовать переменную среды $ PATH и искать данные по пути, относящемуся к каждой записи в $ PATH. Например, нередко хранить двоичные файлы в « installdir / bin» для некоторого установочного каталога «installdir» и хранить связанные данные в « installdir / share / имя_программы "для некоторого каталога установки и некоторой программы с именем" имя_программы ". Если это так, то просмотр «../share/name_of_program[113540 sizes/name_of_resource_file] относительно каждой записи в getenv (« ПУТЬ ») является хорошим способом поиска ресурсов. . Еще одна вещь, которую вы можете сделать, - это разрешить предоставление необходимой информации в командной строке или в каком-либо файле конфигурации и выполнять поиск только в случае необходимости в качестве альтернативного варианта.
Edit
Теперь, когда вы изложили свое обоснование этого, я бы посоветовал вам просто использовать класс QSettings из Qt для информации о конфигурации, поскольку он использует предпочтительный собственный механизм для каждого платформа (реестр в Windows, файл PLIST в Mac OS X, база данных Gnome GConf в Linux). Вы можете взглянуть на мой Шаблон проекта C ++ , поскольку он использует Qt для этого и предоставляет простые параметры командной строки для легкой настройки параметров конфигурации ("--prefset", "--prefget "и" --preflist "управляют настройками QSettings).
Тем не менее, если вам абсолютно необходимо использовать собственный XML-файл конфигурации вместо предпочтительного собственного механизма, я настоятельно рекомендую вам поместить общесистемную конфигурацию в « installdir / etc», в то время как размещение вашей библиотеки в « installdir / lib» для некоторого установочного каталога «installdir», поскольку это типичное место для файлов конфигурации в системах UNIX, а « installdir / lib» следует ТОЛЬКО использоваться для файлов библиотеки, а не для файлов конфигурации и других ошибок. Я предлагаю вам поместить пользовательскую версию файла конфигурации в «$ XDG_CONFIG_HOME» (если он определен) или в «$ HOME / .config» (где «$ HOME» - это домашняя папка пользователя).
При поиске общесистемного файла конфигурации я бы рекомендовал искать в $ XDG_CONFIG_DIRS, если он определен; если он не определен, возврат к «/ etc / xdg» или поиск «../etc/name_of_your_program.conf.xml» относительно «$ PATH» и, возможно, также относительно «$ LD_LIBRARY_PATH», » $ DYLD_LIBRARY_PATH, $ DYLD_FALLBACK_LIBRARY_PATH), содержимое «/etc/ld.so.conf», если оно существует, и содержимое «/etc/ld.so.conf.d/*.conf», если эти файлы существуют, остановка поиска, как только вы встретите первый действительный такой файл конфигурации, будет разумным подходом.
Благодарим Роджера за указание на XDG Basedir Spec и за отличную конструктивную критику.