据我所知,如果我在头文件中定义一个函数,并将该头文件包含在多个源文件(翻译单元)中,并将它们链接在一起,我应该得到重复符号链接器错误。但是,我没有得到的错误有以下文件。你能解释一下我错过了什么吗?先谢了。
// include/library.hpp
#ifndef INCLUDE_LIBRARY_HPP
#define INCLUDE_LIBRARY_HPP
int add(int a, int b) {
return a + b;
}
#endif //INCLUDE_LIBRARY_HPP
// user1.cpp
#include "include/library.hpp"
void doSomething() {
int result = add(10, 20);
}
// user2.cpp
#include "include/library.hpp"
int main() {
int result = add(5, 3);
return 0;
}
# CMakeLists.txt
cmake_minimum_required(VERSION 3.25)
project(proj)
set(CMAKE_CXX_STANDARD 17)
add_library(lib INTERFACE include/library.hpp)
add_library(first_user user1.cpp)
target_link_libraries(first_user PUBLIC lib)
add_executable(second_user user2.cpp)
target_link_libraries(second_user PUBLIC lib first_user)
1条答案
按热度按时间t9eec4r01#
由于在您的应用程序(仅由
main
组成)中,您没有调用doSomething
,因此链接器可以自由地从可执行文件中删除doSomething
的目标代码。因此,您没有得到重复符号链接器错误。在
main
中添加了对doSomething
的调用(可能还要调用add
)后,现在会出现重复符号错误。请注意,链接器将(或应该)删除未使用的目标代码,以减少生成的可执行文件的大小。