Я создал простой проект cmake для его воспроизведения.
├── CMakeLists.txt
├── lib1
│ ├── CMakeLists.txt
│ ├── lib1.cpp
│ └── lib1.h
├── lib2
│ ├── CMakeLists.txt
│ ├── lib2.cpp
│ └── lib2.h
└── main.cpp
lib1 / CMakeLists.txt:
add_library(lib1 "")
target_include_directories(lib1
PUBLIC
${CMAKE_CURRENT_LIST_DIR}
)
target_sources(lib1
PRIVATE
lib1.cpp
lib1.h
)
В lib1. cpp есть функция "void" say () ":
#include <stdio.h>
void say()
{
printf("hello from lib1\n");
}
lib2 / CMakeLists.txt:
add_library(lib2 "")
target_include_directories(lib2
PUBLIC
${CMAKE_CURRENT_LIST_DIR}
)
target_sources(lib2
PRIVATE
lib2.cpp
lib2.h
)
А в lib2 / lib2. cpp есть функция с такой же сигнатурой:
#include <stdio.h>
void say()
{
printf("hello from lib2\n");
}
CMakeLists.txt:
cmake_minimum_required(VERSION 3.16)
project(shell LANGUAGES CXX)
add_subdirectory(lib1)
add_subdirectory(lib2)
add_executable(test2
main.cpp
)
target_link_libraries(test2
PRIVATE
lib1
lib2
)
Вот основной. cpp:
void say();
int main()
{
say();
return 0;
}
Вывод:
hello from lib1
Нет ошибки компиляции или ссылки, даже нет предупреждения. Компоновщик просто выбрал один и проигнорировал другой. Я использую cmake 3.16 и протестировал его с msv c 2017/2019 и g ++ 7.5.
Как заставить компоновщик выдавать сообщения об ошибках, когда в библиотеках stati c возникают конфликты символов?
Спасибо!