链接静态库时内联函数的多个定义

我有一个C ++程序,我用mingw编译(gcc for Windows)。 使用包含gcc 4.4.1的mingw的TDM版本。 可执行文件链接到两个静态库(.a)文件:它们是用C语言编写的第三方库; 另一个是由我编写的C ++库,它使用C库提供我自己的C ++ API。 在我看来,过多的C库function部分是在内联函数中实现的。 当你使用C库的API时,你无法避免包含内联函数,但当我尝试将它们全部链接在一起时,我收到链接错误,说明所有内联函数都有多个定义 – 我都有在我的C ++包装器库中调用,而我没有调用它,基本上在头文件中内联定义的任何东西都有一个在C库和C ++库中为它创建的函数。 当包含文件在同一项目中的不同.c或.cpp文件中多次使用时,它不会导致多个定义错误; 问题只是它为每个库生成一个定义。 编译器如何/为什么在两个库中为这些内联函数生成函数和符号? 如何强制它停止在我的代码中生成它们? 是否有一个工具可以运行以从.a文件中删除重复的函数,或者是一种使链接器忽略多个定义的方法? (仅供参考,第三方库在其所有标题中都包含#ifdef __cplusplus和extern“C”保护;无论如何,如果这是问题,它不会导致符号的多重定义,它会导致相反的问题,因为符号会不确定或至少不同。) 值得注意的是,如果我链接到第三方C库的DLL,则不会发生链接错误; 然而,我得到奇怪的运行时故障,似乎与我的代码有关,它应该从DLL调用自己的函数版本。 (好像编译器正在创建我没有要求的本地版本的函数。) 之前已经问过这个问题的类似版本,但是,我没有找到任何这些问题的答案: 这个问题的答案是海报是多个定义变量 ,我的问题是内联函数的多重定义 : 重复的多重定义错误在多个cpps中包含相同的标题 这是一个MSVC计划,但我正在使用mingw; 另外,这个问题中海报的问题是在标题中类主体之外的C ++类构造函数的定义,而我的问题是内联的C函数: 静态Lib多重定义问题 这个傻瓜将他的所有C代码重命名为C ++文件,而他的C代码不是C ++ – 安全: 链接时许多std :: functions的多个定义 这个只是想知道为什么违反一个定义规则不是错误: 具有不同定义的内联函数的不可预测的行为

使用SO_REUSEADDR?

我已经使用SO_REUSEADDR让我的服务器终止重启而没有抱怨套接字已经在使用中。 我想知道是否还有SO_REUSEADDR其他用途? 有没有人使用套接字选项除了上述目的?

c中的整数大小取决于什么?

整数的大小取决于什么? C中的int变量的大小是否依赖于机器或编译器?

当我使用错误的格式说明符时会发生什么?

只是想知道当我在C中使用错误的格式说明符时会发生什么? 例如: x = ‘A’; printf(“%c\n”, x); printf(“%d\n”, x); x = 65; printf(“%c\n”, x); printf(“%d\n”, x); x = 128; printf(“%d\n”, x);

打印__m128i变量

我正在尝试学习使用内在函数进行编码,下面是一个添加代码的代码 compiler used: icc #include #include int main() { __m128i a = _mm_set_epi32(1,2,3,4); __m128i b = _mm_set_epi32(1,2,3,4); __m128i c; c = _mm_add_epi32(a,b); printf(“%d\n”,c[2]); return 0; } 我得到以下错误: test.c(9): error: expression must have pointer-to-object type printf(“%d\n”,c[2]); 如何在变量c打印__m128i类型的__m128i

是否有使用时间来播种随机数生成的替代方案?

我试图在计算集群中同时运行一段代码(2000个实例左右)的几个实例。 它的工作方式是我提交作业,群集将在节点每隔一段时间打开时运行它们,每个节点有几个作业。 对于使用时间种子的随机数生成中的大量实例,这似乎产生相同的值。 我可以使用一个简单的替代方案吗? 重复性和安全性并不重要,快速生成独特的种子。 什么是最简单的方法,如果可能的话,跨平台方法会很好。

在C中将float转换为int(按位)

给定代表IEEE 754浮点数的32位,如何使用表示上的整数或位操作(而不是使用机器指令或编译器操作进行转换)将数字转换为整数? 编辑#1: 我必须遵循function但在某些情况下失败: 输入:int x(包含IEEE 754格式的32位单精度数) if(x == 0) return x; unsigned int signBit = 0; unsigned int absX = (unsigned int)x; if (x < 0) { signBit = 0x80000000u; absX = (unsigned int)-x; } unsigned int exponent = 158; while ((absX & 0x80000000) == 0) { exponent–; absX <> 8; unsigned int result […]

在Windows和Linux下,在C中将UTF-16转换为UTF-8

我想知道是否有一个推荐的’交叉’Windows和Linux方法,用于将字符串从UTF-16LE转换为UTF-8? 或者每个环境应该使用不同的方法? 我设法谷歌几个引用’iconv’,但对于somreason我找不到基本转换的样本,例如 – 将wchar_t UTF-16转换为UTF-8。 任何人都可以推荐一种“交叉”的方法,如果您知道参考文献或带样本的指南,我将非常感激。 谢谢,Doori酒吧

函数调用循环比空循环快

我将一些程序集与一些c链接起来测试函数调用的成本,使用以下程序集和c源代码(分别使用fasm和gcc) 部件: format ELF public no_call as “_no_call” public normal_call as “_normal_call” section ‘.text’ executable iter equ 100000000 no_call: mov ecx, iter @@: push ecx pop ecx dec ecx cmp ecx, 0 jne @b ret normal_function: ret normal_call: mov ecx, iter @@: push ecx call normal_function pop ecx dec ecx cmp ecx, 0 jne @b […]

scanf的exception行为

我有如下代码扫描矩阵,w – 矩阵的宽度,矩阵的h – 高度。 我正在使用Visual Studio 2010。 每次我得到一个字符时它会将j增加2(我把断点放到了解这个行为)。 int w = 0, h = 0; char map[21][21]; int i,j; scanf(“%d%d”, &w, &h); for(i = 1; i <= h; ++i){ for(j = 1; j <= w; ++j){ //fflush(stdin); scanf("%c",&map[i][j]); //fflush(stdin); } } 这背后的原因是什么? 在扫描时我给出值,w = 7,h = 5。 我的代码中没有看到任何错误….请帮助我。