带有 rand() 函数的动态链接器错误
dynamic linker error with rand() function
我之前已经问过一个关于这个问题的问题,但再次参考以下代码
#include <iostream>
using std::cout;
using std::endl;
#include <dlfcn.h>
int rand() throw() {
// get the original rand() function
static auto original_rand = (decltype(&rand)) dlsym(RTLD_NEXT, "rand");
cout << "Call made to rand()" << endl;
return original_rand();
}
为什么编译此会导致以下错误
error: exception specification in declaration does not match previous declaration
为什么会这样?链接器如何知道这只是我自己声明的另一个 rand(( 函数,而是 rand()
的现有版本?
您的一个头文件(在我的情况下<iostream>
(静默地包含<stdlib.h>
,其中包含rand()
函数。后者没有任何异常规范。在您的代码中,您尝试重载rand()
,但签名与<stdlib.h>
签名相同,除了异常说明符(它不是函数类型的一部分,因此不能单独重载(,因此您会收到编译时错误(不是链接器错误,如您在问题中提到的(。
如果您想知道为什么静默包含rand()
函数在全局命名空间中也可见(不像您期望的那样std::rand
可见(,那是因为 C 库函数通常通过直接导入到标准C++头文件中
// <new_cpp_header>
#include <old_c_header.h>
其次
namespace std
{
using old_function_from_old_c_header;
}
因此,该函数最终在全局命名空间和namespace std;
中结束。这不是一个很好的做法 IMO,但这就是当今大多数编译器的做法。
例如,<cstdio>
文件具有:
// <cstdio>
#include <stdio.h>
namespace std
{
using printf;
// ...
}
因此,printf
和std::printf
都是可见的,即使您只包含<cstdio>
(而不是<stdio.h>
(。
相关文章:
- g++用户定义的动态链接库上的全局new和delete运算符
- 如何使用C++导出制作动态链接库
- 使用动态链接加载程序 <dlfcn.h> 而不是直接函数调用的目的是什么?
- 动态链接库中C++回调函数
- 我的动态链接队列在同一输出流中调用时不正确地输出三个返回函数
- 如何动态链接 grpc 库 c++?
- 调用函数一次用于动态链接库,一次从可执行文件调用函数
- 将函数传递给动态链接库
- aarch64动态链接器rpath使用辅助依赖链接
- 动态链接-Linux与Windows
- 如何将动态链接库与CMake一起使用
- 使用动态链接从.dll库调用函数
- 静态链接 Visual Studio dll 到动态链接的 sfml 项目
- 从另一个动态链接库项目调用静态库函数
- JNI 不满意链接错误: 动态链接库 (DLL) 初始化例程失败
- 使用 GCC 的静态和动态链接
- 静态链接MSVC库,动态链接Qt
- 在动态链接中,.exe如何知道在更新库时在哪里搜索库?
- 如何强制Windows.h在Visual Studio中静态链接而不是动态链接?
- 对应于 stdio.h 的库文件是动态链接还是静态链接