函数可以定义在3个地方
1. 程序自身
2. 静态库
3. 动态库
因为静态库是要链进程序的,所以函数定义在程序和静态库可以看成是一样的
同名函数出现在程序和静态库中,链接时会报重定义的错误。
同名函数出现在动态库中,编译链接都可以通过,但是调用会出问题,会出现覆盖问题。
定义在这3个地方的函数,会调用哪个函数呢?经过测试,得出下面的结论:
1. 程序和静态库定义了同名函数,链接报错:重定义
2. 程序或静态库定义的同名函数,会覆盖动态库中定义的函数
3. 动态库中定义的同名函数,先链接覆盖后链接的函数
采用命名空间可以解决覆盖问题。
测试代码如下:
dynamic.h
- #ifndef _DYNAMIC_LIB_H_
- #define _DYNAMIC_LIB_H_
- void Dynamic();
- #endif
dynamic.cpp
- #include "dynamic.h"
- #include <stdio.h>
- void SameName()
- {
- printf("fun in dynamic lib/n");
- }
- void Dynamic()
- {
- SameName();
- }
dynamic2.h
- #ifndef _DYNAMIC2_LIB_H_
- #define _DYNAMIC2_LIB_H_
- void Dynamic2();
- #endif
dynamic2.cpp
- #include "dynamic2.h"
- #include <stdio.h>
- void SameName()
- {
- printf("fun in dynamic2 lib/n");
- }
- void Dynamic2()
- {
- SameName();
- }
test.cpp
- #include <stdio.h>
- #include "dynamiclib.h"
- #include "dynamiclib2.h"
- /*
- void SameName() // overlay all functions in dynamic lib
- {
- printf("fun in program/n");
- }
- */
- int main()
- {
- //SameName();
- Dynamic();
- Dynamic2();
- }
Makefile.am
- AUTOMAKE_OPTIONS=foreign
- bin_PROGRAMS=test
- lib_LTLIBRARIES=libdynamic.la libdynamic2.la
- test_SOURCES = test.cpp
- libdynamic_la_SOURCES= dynamiclib.cpp
- libdynamic2_la_SOURCES= dynamiclib2.cpp
- CXXFLAGS=-D__LINUX__ -g
- CC=g++
- # 1. 都作为静态库,报错:重定义
- #test_LDADD= -L. .libs/libdynamic.a .libs/libdynamic2.a
- # 2. 静态库覆盖动态库
- #test_LDADD= -L. .libs/libdynamic.a -ldynamic2 # 调用dynamic中的函数
- #test_LDADD= -L. -ldynamic .libs/libdynamic2.a # 调用dynamic2中的函数
- # 3 编译通过,先链接的覆盖后链接的 # ps: ldd 两者先后不同
- #test_LDADD= -L. -ldynamic -ldynamic2 # 调用dynamic中的函数
- test_LDADD= -L. -ldynamic2 -ldynamic # 调用dynamic2中的函数
- #如果test.cpp里定义了SameName函数,调用的是test.cpp里的
configure.ac
- # -*- Autoconf -*-
- # Process this file with autoconf to produce a configure script.
- AC_PREREQ(2.59)
- AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS)
- AM_INIT_AUTOMAKE
- # Checks for programs.
- AC_PROG_CXX
- AC_PROG_CC
- AC_PROG_LIBTOOL
- # Checks for libraries.
- # FIXME: Replace `main' with a function in `-ldynamic':
- AC_CHECK_LIB([dynamic], [main])
- # FIXME: Replace `main' with a function in `-ldynamic2':
- AC_CHECK_LIB([dynamic2], [main])
- # Checks for header files.
- AC_HEADER_STDC
- AC_CHECK_HEADERS([string.h])
- # Checks for typedefs, structures, and compiler characteristics.
- AC_C_CONST
- # Checks for library functions.
- AC_CONFIG_FILES([Makefile])
- AC_OUTPUT