提问人:Erik Nouroyan 提问时间:8/12/2023 更新时间:8/12/2023 访问量:50
我期望得到重复的符号链接器错误,但我没有得到它,为什么?
I am expecting to get duplicate symbol linker error but I don't get it, why?
问:
据我所知,如果我在头文件中定义一个函数并将该头文件包含在多个源文件(翻译单元)中,并将它们链接在一起,我应该会得到重复的符号链接器错误。但是,我没有收到以下文件的错误。 你能解释一下我在这里错过了什么吗?提前致谢。
// 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)
答:
3赞
PaulMcKenzie
8/12/2023
#1
由于在您的应用程序(仅由 )中,您没有调用 ,链接器可以自由地从可执行文件中删除目标代码。因此,您没有收到重复的符号链接器错误。main
doSomething
doSomething
一旦你添加了对in的调用(可能还有调用),你现在就会得到重复的符号错误。doSomething
main
add
请注意,链接器将(或应该)删除未使用的目标代码,以此来减小生成的可执行文件的大小。
下一个:对函数的未定义引用,但都已定义
评论
doSomething