C ++如何在Unix中获取正在执行的.so模块的文件名(和路径)?
类似于Windows上的GetModuleFileName。
答案 0 :(得分:6)
虽然它不是POSIX标准界面,但许多系统都提供dladdr()
功能,包括Linux,Solaris,Darwin/Mac OS X,FreeBSD,{ {3}}和HP-UX。此函数接受一个地址,该地址可以是模块中静态函数的指针(例如,如果强制转换为void *
),并使用包含共享路径名的信息填充Dl_info
结构包含该地址的对象(在dli_fname
成员中)。
答案 1 :(得分:2)
不幸的是,使用UNIX或POSIX无法做到这一点。如果需要使用它来查找某种数据,则应使用$ PATH环境变量并在与$ PATH中的每个条目相关的路径中搜索数据。例如,在“ installdir / bin”中为某些安装目录“installdir”存储二进制文件并将关联数据存储在“ installdir / share / <中并不罕见i> name_of_program “用于某些安装目录和一些名为”name_of_program“的程序。如果是这种情况,那么相对于getenv(“PATH”)中的每个条目查看“../ share / name_of_program / name_of_resource_file ”是一种很好的搜索方式对于资源。您可以做的另一件事是允许在命令行或某些配置文件中提供必要的信息,并且只在需要时执行搜索作为后备选项。
修改的
既然你已经说明了你的理由,我建议你只需使用Qt的QSettings类来获取配置信息,因为它使用了每个平台的首选本机机制(Windows上的注册表,PLIST) Mac OS X上的文件,Linux上的Gnome GConf数据库)。您可能需要查看我的C++ Project Template,因为它使用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”或搜索相对于“$ PATH”的“../etc/name_of_your_program.conf.xml”,也可能相对于“$ LD_LIBRARY_PATH”,“ $ DYLD_LIBRARY_PATH“,”$ DYLD_FALLBACK_LIBRARY_PATH“),”/etc/ld.so.conf“的内容是否存在,以及”/etc/ld.so.conf.d/*.conf“的内容,如果这些文件存在,一旦遇到第一个有效的配置文件就停止搜索将是一种明智的方法。
归功于Roger指出XDG Basedir Spec及其出色的建设性批评。
答案 2 :(得分:0)
可能的解决方案:
/proc/{PID}/mmap
文件以获取共享库列表。其中{PID}是流程pid(您可以使用getpid()
获得)。ldd
以获取程序二进制文件(存储在argv[0]
中)。ldd
的{{1}}命令源代码,了解如何从elf二进制文件中获取共享库列表。