Есть ли способ создать предупреждение или ошибку при создании статической библиотеки с повторяющимися символами?Учитывая приведенный ниже пример проекта, я могу создать ошибку во время соединения, включив параметр -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