我期望得到重复的符号链接器错误,但我没有得到它,为什么?

I am expecting to get duplicate symbol linker error but I don't get it, why?

提问人:Erik Nouroyan 提问时间:8/12/2023 更新时间:8/12/2023 访问量:50

问:

据我所知,如果我在头文件中定义一个函数并将该头文件包含在多个源文件(翻译单元)中,并将它们链接在一起,我应该会得到重复的符号链接器错误。但是,我没有收到以下文件的错误。 你能解释一下我在这里错过了什么吗?提前致谢。

// 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)
C++ CMake 链接 链接器错误 重复符号

评论

3赞 PaulMcKenzie 8/12/2023
你实际上无处可打电话.至少,使用您声明的函数。链接器可以自由删除未使用的目标代码。如果它不这样做,那么程序员将拥有巨大的可执行文件,并添加未使用的函数。doSomething
0赞 Erik Nouroyan 8/12/2023
就是这样,在分离了 doSomething 的声明和定义并在 main 中使用它后,我遇到了错误,谢谢

答:

3赞 PaulMcKenzie 8/12/2023 #1

由于在您的应用程序(仅由 )中,您没有调用 ,链接器可以自由地从可执行文件中删除目标代码。因此,您没有收到重复的符号链接器错误。maindoSomethingdoSomething

一旦你添加了对in的调用(可能还有调用),你现在就会得到重复的符号错误。doSomethingmainadd

请注意,链接器将(或应该)删除未使用的目标代码,以此来减小生成的可执行文件的大小。