我希望收到重复的符号链接器错误,但我不明白,为什么?

问题描述 投票:0回答:1

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

// 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 linker linker-errors duplicate-symbol
1个回答
0
投票

由于在您的应用程序(仅由

main
组成)中,您没有调用
doSomething
,因此链接器可以自由地从可执行文件中删除
doSomething
的目标代码。因此,您没有收到重复的符号链接器错误。

一旦您在

doSomething
中添加了对
main
的调用(还可能调用
add
),您现在会收到重复符号错误。

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

© www.soinside.com 2019 - 2024. All rights reserved.