如何在不同的库(.a)中编译具有相同变量名的c代码

如何在不同的库(.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

我构建了两个名为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的多重定义
temp2lib.a:首先在这里定义“

根据lib、对象文件和变量的名称判断,这只是一个玩具库。编写真正的库时,必须考虑其设计:

  • 在Unix下,通常将lib命名为
    libsomething.a
    。因此,您的LIB应该被称为
    libtemp1.a
    libtemp2.a
    ,这样您就可以轻松地将它们与
    -ltemp1
    -ltemp2
    链接起来

  • 如果导出所有符号,可能会导出太多,从而使链接符号可用的命名空间变得混乱

  • 考虑应该导出哪些符号。lib的用户需要知道可以使用哪些符号,因此lib可能附带一个头文件。这是lib的接口。您只需要导出该接口中的符号。首先,使尽可能多的全局变量和函数成为静态的,即一个编译单元(对象文件)的局部变量和函数。如果您仍然导出太多的符号,请考虑.< /p>
  • C没有包或名称空间。最好在所有导出的符号前加一个短前缀,例如
    temp1_var_a
    temp1_initi
    等等

  • 为符号选择有意义的名称。全局变量不应被称为
    var\u A
    。使用这个经验法则:小范围,短名称。范围大,名称长

  • 如果您是LIB的唯一用户,请不要羞于重建LIB


如果您希望从LIB外部访问函数和变量,请重命名它们并包含前缀

如果这些函数和变量仅供内部使用,请使用static关键字:


您能提供更多关于失败原因的信息吗?使用的编译命令是什么?我想是的,但请提供编译命令行和错误。如果可能是最简单的事情,请创建库。在两个不同的静态库中不能有两个同名的全局变量。函数也是一样。有什么方法可以解决这个问题吗?例如包或名称空间?如果templib1.a内部使用了一个变量;aaa.c和bbb.c必须使用此VARABLE。我可以在aaa.c中使用static int var_ab,在bbb.c中使用extern static int var_ab吗?您是否尝试过更简单的解决方案:在头文件中声明static int var_ab?