// file "t1.h":
int get1();
// file "t1.c":
int get1(){return 1;}
// file "t2.h":
int get2();
// file "t2.c":
int get1(){return 99;} // <- duplicate definition of get1(), I would like to hide it somehow
int get2(){return 2;}
// file "t3.c":
#include <stdio.h>
#include "t1.h"
#include "t2.h"
int main(int argc, char ** argv) {
printf("%d\n", get1());
printf("%d\n", get2());
}
编译命令
gcc -c t1.c && gcc -c t2.c && gcc -c t3.c && gcc t1.o t2.o t3.o -o t3`
结果是错误:
t2.c:(.text+0x0): multiple definition of 'get1'.
问题很明显,get1()
定义了两次。
为什么我仍在寻找解决方案?
get1()
的第二个定义,我想丢弃它隐藏它。static
或重命名它对我不起作用,因为“t1.c”和“t2.c”会自动生成。有没有办法以某种方式隐藏所选符号而不修改.c
文件?
或者仅显示所选符号。
或重命名。
类似于:gcc -c t2.c --hide-symbol=get1
有程序flex
生成lexer .c
文件。
有可能通过重新定义宏来改变某些行为。
我需要生成两个不同的词法分析器,它们都由同一个程序使用。
在flex
中,可以将注释中提到的前缀从“yy *”更改为“somethingelse *”。
http://westes.github.io/flex/manual/Code_002dLevel-And-API-Options.html#index-prefix
答案 0 :(得分:0)
程序员可以使用关键字static
隐藏符号。任何未声明为static
的符号在目标文件的全局命名空间中都可见。
可能有一个目标文件编辑器,允许您重命名导出的符号,但Google没有显示任何结果。您始终可以编辑二进制对象文件 - 确保名称保持相同的长度,以免以后混淆链接器。