Как предотвратить дублирование символов в статической библиотеке? - PullRequest
0 голосов
/ 28 мая 2018

Есть ли способ создать предупреждение или ошибку при создании статической библиотеки с повторяющимися символами?Учитывая приведенный ниже пример проекта, я могу создать ошибку во время соединения, включив параметр -all_load, но в противном случае кажется, что ld не может молча выбрать первый символ без предупреждения.

CMakeLists.txt

cmake_minimum_required(VERSION 3.8)
project(hello)

set(SOURCE_FILES hello1.cpp hello2.cpp hello.h)
add_library(hellolib ${SOURCE_FILES})
add_executable(hellobin main.cpp)
target_link_libraries(hellobin hellolib)

hello.h

#pragma once

void hello();

hello1.cpp

#include "hello.h"
#include <iostream>

void hello() {
  std::cout << "Hello, World!" << std::endl;
}

hello2.cpp

#include "hello.h"
#include <iostream>

void hello() {
  std::cout << "Goodbye, World!" << std::endl;
}

main.cpp

#include "hello.h"

int main() {
  hello();
}

Как уже упоминалось выше, я могу создать проблему, если добавлю опцию all_load к CMakeLists.txt:

set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -all_load")

Есть ли какой-то способсгенерировать это вместо этого на этапе создания статической библиотеки?

Обновить

Я могу заставить CMake выдать ошибку, если я выполню следующую проверку с nm и добавлю пользовательскую команду в мойCMakeLists.txt (хотя это все еще кажется хакерским):

CMakeLists.txt

add_custom_command(TARGET hellolib POST_BUILD COMMAND ${CMAKE_SOURCE_DIR}/check_build.sh ${CMAKE_CURRENT_BINARY_DIR}/libhellolib.a)

check_build.sh

#!/usr/bin/env bash
if [ "$#" -ne 1 ];
then
    echo "err: usage ./check_build.sh <lib file>"
    exit 1
fi

MAX_SYM=`nm $1 | perl -ne 'print if / T .+$/' | sort | uniq -c | sort -n | tail -n 1 | awk '{print $1}'`

if [ "$MAX_SYM" -ne "1" ]
then
    echo "Saw duplicate symbol."
    exit 1
fi

Ответы [ 2 ]

0 голосов
/ 28 мая 2018

Я думаю, что эта роль не является обязанностью GCC.Это ответственность л.д.так что это имеет смысл.

gcc обнаруживает дубликаты символов / функций в статических библиотеках

0 голосов
/ 28 мая 2018

Это действительно не очень хороший способ кодирования.Если вам действительно нужно использовать одно и то же имя, вы можете inline функцию.Но действительно подумайте о том, чтобы сделать это правильно с пространствами имен.

Помещение hello () в отдельное пространство имен предотвратит случайную двойную реализацию.Я не думаю, что то, что вы хотите сделать, возможно с отдельными модулями компиляции, которые видят только части кода.

Во всяком случае мои 2 цента на этом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...