当一个静态库libtest.a包含下述头文件test.h。另一个可执行文件也包含test.h头文件,同时又依赖libtest.a时,会出现多重定义问题(multiple definition of XXX)。用static修饰时,可以避免。使用inline也能避免
test.h
#include <iostream>
namespace test {
// 可能导致多重定义问题
void test() {
std::cout << "test" << std::endl;
}
/*
// 可以避免多重定义问题
static void test() {
std::cout << "test" << std::endl;
}
*/
}
以下是用来复现该问题的代码举例。没有编译、运行过,可能无法编译过。仅用于说明使用
test_print.h
class TestPrint {
static void test_print();
};
test_print.cc
#include "test.h"
void TestPrint::test_print() {
test();
}
main.cc
#include "test.h"
#include "test_print.h"
int main() {
test();
TestPrint::test_print();
return 0;
}
CMakeLists.txt
cmake_minimum_required(VERSION 3.10)
project(test)
include_directories(include)
add_library(test STATIC test_print.cc)
add_executable(${PROJECT_NAME} main.cc)
target_link_libraries(${PROJECT_NAME} test)