gpt4 book ai didi

c++ - 如何防止静态库中的重复符号?

转载 作者:行者123 更新时间:2023-11-30 05:00:49 25 4
gpt4 key购买 nike

如果创建具有重复符号的静态库,是否有办法创建警告或错误?鉴于下面的示例项目,我可以通过包含 -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)

你好.h

#pragma once

void hello();

你好1.cpp

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

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

你好2.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")

是否有某种方法可以在静态库生成步骤中生成它?

更新

如果我使用 nm 执行以下检查并向我的 CMakeLists.txt 添加自定义命令(尽管看起来仍然如此),我能够导致 CMake 抛出错误哈克):

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

最佳答案

这确实不是一种好的编码方式。如果确实需要使用相同的名称,可以内联 函数。但真的要考虑使用 namespace 正确地做到这一点。

将 hello() 放在不同的命名空间中可以防止意外的双重实现。我不认为你想做的事情对于单独的编译单元是可能的,它只能看到部分代码。

无论如何,我的 2 美分。

关于c++ - 如何防止静态库中的重复符号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50561882/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com