如何在不同的库(.a)中编译具有相同变量名的c代码
我构建了两个名为templab1.a和templab2.a的库 templib1.a和templib2.a中的一些全局变量和函数名是相同的;当我试图用这两个库编译我的c代码时,它失败了 除了名称空间之外,还有什么方法可以解决这个问题吗?我需要重建图书馆吗?谢谢 ======================================================================= 我构建的库如下 从aaa.cbb.cddd.caaa.h构建templab1.a;有全局变量int var_a,int var b;以及aaa.c和bbb.c中的函数void func_a()、void func_b() 从aaa.cbb.ceee.caaa.h构建templab2.a;有全局变量int var_a,int var b;以及aaa.c和bbb.c中的函数void func_a()、void func_b() 我喜欢我的c代码 gcc$(INC)$(templab1_DIR)/templab1.a$(templab2_DIR)/temp2lib.a-o运行 它表明 “var_a的多重定义 temp2lib.a:首先在此处定义” “var_b的多重定义如何在不同的库(.a)中编译具有相同变量名的c代码,c,static-libraries,C,Static Libraries,我构建了两个名为templab1.a和templab2.a的库 templib1.a和templib2.a中的一些全局变量和函数名是相同的;当我试图用这两个库编译我的c代码时,它失败了 除了名称空间之外,还有什么方法可以解决这个问题吗?我需要重建图书馆吗?谢谢 ======================================================================= 我构建的库如下 从aaa.cbb.cddd.caaa.h构建templab1.a;有全局变量i
temp2lib.a:首先在这里定义“根据lib、对象文件和变量的名称判断,这只是一个玩具库。编写真正的库时,必须考虑其设计:
- 在Unix下,通常将lib命名为
。因此,您的LIB应该被称为libsomething.a
和libtemp1.a
,这样您就可以轻松地将它们与libtemp2.a
和-ltemp1
链接起来-ltemp2
- 如果导出所有符号,可能会导出太多,从而使链接符号可用的命名空间变得混乱
- 考虑应该导出哪些符号。lib的用户需要知道可以使用哪些符号,因此lib可能附带一个头文件。这是lib的接口。您只需要导出该接口中的符号。首先,使尽可能多的全局变量和函数成为静态的,即一个编译单元(对象文件)的局部变量和函数。如果您仍然导出太多的符号,请考虑.< /p>
- C没有包或名称空间。最好在所有导出的符号前加一个短前缀,例如
,temp1_var_a
等等temp1_initi
- 为符号选择有意义的名称。全局变量不应被称为
。使用这个经验法则:小范围,短名称。范围大,名称长var\u A
- 如果您是LIB的唯一用户,请不要羞于重建LIB
您能提供更多关于失败原因的信息吗?使用的编译命令是什么?我想是的,但请提供编译命令行和错误。如果可能是最简单的事情,请创建库。在两个不同的静态库中不能有两个同名的全局变量。函数也是一样。有什么方法可以解决这个问题吗?例如包或名称空间?如果templib1.a内部使用了一个变量;aaa.c和bbb.c必须使用此VARABLE。我可以在aaa.c中使用static int var_ab,在bbb.c中使用extern static int var_ab吗?您是否尝试过更简单的解决方案:在头文件中声明static int var_ab?