CMake не может обнаружить конфликты символов в разных библиотеках stati c - PullRequest
1 голос
/ 19 апреля 2020

Я создал простой проект 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 возникают конфликты символов?

Спасибо!

1 Ответ

3 голосов
/ 19 апреля 2020

Как заставить компоновщик выдавать сообщения об ошибках при возникновении конфликтов символов в библиотеках stati c?

При gcc используйте параметр --whole-archive, чтобы включить каждый объектный файл в архив, а не искать в архиве требуемый символ.

Так как я не знаю поддержки cmake, я нахожу, что обычно это делается при связывании исполняемого файла:

target_link_libraries(test2 PRIVATE
    -Wl,--whole-archive
    lib1
    lib2
    -Wl,--no-whole-archive
)

«Конфликты символов» - это довольно расплывчатый термин. Это позволит обнаружить только несколько определений символов. Типы символов нигде не хранятся после компиляции.

...