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

fxnxkyjh  于 9个月前  发布在  其他
关注(0)|答案(1)|浏览(90)

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

// 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)
t9eec4r0

t9eec4r01#

由于在您的应用程序(仅由main组成)中,您没有调用doSomething,因此链接器可以自由地从可执行文件中删除doSomething的目标代码。因此,您没有得到重复符号链接器错误。
main中添加了对doSomething的调用(可能还要调用add)后,现在会出现重复符号错误。
请注意,链接器将(或应该)删除未使用的目标代码,以减少生成的可执行文件的大小。

相关问题