同名函数的调用问题

函数可以定义在3个地方

1. 程序自身
2. 静态库
3. 动态库


因为静态库是要链进程序的,所以函数定义在程序和静态库可以看成是一样的

同名函数出现在程序和静态库中,链接时会报重定义的错误。

同名函数出现在动态库中,编译链接都可以通过,但是调用会出问题,会出现覆盖问题。


定义在这3个地方的函数,会调用哪个函数呢?经过测试,得出下面的结论:

1. 程序和静态库定义了同名函数,链接报错:重定义
2. 程序或静态库定义的同名函数,会覆盖动态库中定义的函数
3. 动态库中定义的同名函数,先链接覆盖后链接的函数


采用命名空间可以解决覆盖问题。


测试代码如下:

dynamic.h
  1. #ifndef _DYNAMIC_LIB_H_
  2. #define _DYNAMIC_LIB_H_
  3. void Dynamic();
  4. #endif
dynamic.cpp
  1. #include "dynamic.h"
  2. #include <stdio.h>
  3. void SameName()
  4. {
  5.     printf("fun in dynamic lib/n");
  6. }
  7. void Dynamic()
  8. {
  9.     SameName();
  10. }
dynamic2.h
  1. #ifndef _DYNAMIC2_LIB_H_
  2. #define _DYNAMIC2_LIB_H_
  3. void Dynamic2();
  4. #endif
dynamic2.cpp
  1. #include "dynamic2.h"
  2. #include <stdio.h>
  3. void SameName()
  4. {
  5.     printf("fun in dynamic2 lib/n");
  6. }
  7. void Dynamic2()
  8. {
  9.     SameName();
  10. }
test.cpp
  1. #include <stdio.h>
  2. #include "dynamiclib.h"
  3. #include "dynamiclib2.h"
  4. /*
  5. void SameName() // overlay all functions in dynamic lib
  6. {
  7.     printf("fun in program/n");
  8. }
  9. */
  10. int main()
  11. {
  12.     //SameName();
  13.     Dynamic();
  14.     Dynamic2();
  15. }
Makefile.am
  1. AUTOMAKE_OPTIONS=foreign
  2. bin_PROGRAMS=test
  3. lib_LTLIBRARIES=libdynamic.la libdynamic2.la
  4. test_SOURCES    =   test.cpp
  5. libdynamic_la_SOURCES= dynamiclib.cpp
  6. libdynamic2_la_SOURCES= dynamiclib2.cpp
  7. CXXFLAGS=-D__LINUX__  -g
  8. CC=g++
  9. # 1. 都作为静态库,报错:重定义
  10. #test_LDADD= -L. .libs/libdynamic.a .libs/libdynamic2.a
  11. # 2. 静态库覆盖动态库
  12. #test_LDADD= -L. .libs/libdynamic.a -ldynamic2 # 调用dynamic中的函数
  13. #test_LDADD= -L. -ldynamic .libs/libdynamic2.a # 调用dynamic2中的函数
  14. # 3 编译通过,先链接的覆盖后链接的 # ps: ldd 两者先后不同
  15. #test_LDADD= -L. -ldynamic -ldynamic2 # 调用dynamic中的函数
  16. test_LDADD= -L. -ldynamic2 -ldynamic # 调用dynamic2中的函数
  17. #如果test.cpp里定义了SameName函数,调用的是test.cpp里的
configure.ac
  1. #                                               -*- Autoconf -*-
  2. # Process this file with autoconf to produce a configure script.
  3. AC_PREREQ(2.59)
  4. AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS)
  5. AM_INIT_AUTOMAKE
  6. # Checks for programs.
  7. AC_PROG_CXX
  8. AC_PROG_CC
  9. AC_PROG_LIBTOOL
  10. # Checks for libraries.
  11. # FIXME: Replace `main' with a function in `-ldynamic':
  12. AC_CHECK_LIB([dynamic], [main])
  13. # FIXME: Replace `main' with a function in `-ldynamic2':
  14. AC_CHECK_LIB([dynamic2], [main])
  15. # Checks for header files.
  16. AC_HEADER_STDC
  17. AC_CHECK_HEADERS([string.h])
  18. # Checks for typedefs, structures, and compiler characteristics.
  19. AC_C_CONST
  20. # Checks for library functions.
  21. AC_CONFIG_FILES([Makefile])
  22. AC_OUTPUT
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值