如何创建一个宏来获取编译类的库名?

时间:2009-10-08 19:34:08

标签: c++ macros

如何创建一个宏来获取编译类的库名?有没有办法从make获取这些信息?

基本上我想做类似的事情:

  #  define LIBRARY_NAME (get info from make maybe?)
  ...
  #  ifdef LIBRARY_NAME
        static const char* s_lib_name = STRINGIZE(LIBRARY_NAME);

谢谢!

2 个答案:

答案 0 :(得分:3)

g++允许您使用-DMACRO_NAME=MACRO_VALUE在命令行上提供宏值。据推测,其他编译器具有类似的功能。

这等同于

#define MACRO_NAME MACRO_VALUE 

位于正在处理的每个文件的顶部。

省略=MACRO_VALUE部分相当于普通#define MACRO_NAME

所以现在你要做的就是让make跟踪你正在编译的每个文件的最终目的地(这可能是也可能不是微不足道的,取决于你正在做什么...... )。


您还可以查看c preprocessor中的#字符串化和##标记化运算符。他们可以在这里为你节省一些工作......

答案 1 :(得分:0)

编译器无法知道它正在创建的目标文件是存档在库中还是链接到可执行文件中 - 这是一个独立且独立的过程,因此没有实际的方法来实现静态库;特别是因为单个目标文件可能存档到多个库,并且库的名称是任意的,您可以更改文件的名称,它没有任何区别。你甚至可以从一个库中取出一个对象,然后将它添加到另一个完全不同的库中。

有一个预定义的宏__FILE__,它解析为正在编译的源的文件名。但我不确定这对你有什么帮助。这会告诉你sourcefile(和隐含的目标文件),但不是库。

可能有一些方法可以对DLL或共享库进行此操作,因为这些是在运行时加载的,因此库文件名必须在运行时隐式知道。