【发布时间】:2015-10-28 02:08:34
【问题描述】:
我正在尝试使用一个库(Watt-32,如果相关),由于某种原因无法链接。我已经编译了库,作为一个快速的“hello world”测试,我正在尝试编译以下文件:
#include <tcp.h>
int main() { sock_init(); }
这会导致 GCC 在库自己的源文件中生成一个长 multiple definition 错误列表:
D:\projects\test-tcp>c++ -Iinclude test-tcp.cpp -Llib -lwatt
lib\libwatt.a(rs232.o): In function `_ntohl':
D:\msys64\home\JW\watt32\src/../inc/sys/swap.h:63: multiple definition of `__ntohl'
lib\libwatt.a(pctcp.o):D:\msys64\home\JW\watt32\src/../inc/sys/swap.h:63: first defined here
lib\libwatt.a(rs232.o): In function `_ntohs':
D:\msys64\home\JW\watt32\src/../inc/sys/swap.h:73: multiple definition of `__ntohs'
lib\libwatt.a(pctcp.o):D:\msys64\home\JW\watt32\src/../inc/sys/swap.h:73: first defined here
lib\libwatt.a(rs232.o): In function `get_fs_reg':
D:\msys64\home\JW\watt32\src/misc.h:736: multiple definition of `get_fs_reg'
lib\libwatt.a(pctcp.o):D:\msys64\home\JW\watt32\src/misc.h:736: first defined here
lib\libwatt.a(rs232.o): In function `get_gs_reg':
D:\msys64\home\JW\watt32\src/misc.h:744: multiple definition of `get_gs_reg'
lib\libwatt.a(pctcp.o):D:\msys64\home\JW\watt32\src/misc.h:744: first defined here
lib\libwatt.a(rs232.o): In function `set_fs_reg':
D:\msys64\home\JW\watt32\src/misc.h:751: multiple definition of `set_fs_reg'
lib\libwatt.a(pctcp.o):D:\msys64\home\JW\watt32\src/misc.h:751: first defined here
lib\libwatt.a(rs232.o): In function `set_gs_reg':
D:\msys64\home\JW\watt32\src/misc.h:757: multiple definition of `set_gs_reg'
lib\libwatt.a(pctcp.o):D:\msys64\home\JW\watt32\src/misc.h:757: first defined here
lib\libwatt.a(ports.o): In function `_ntohl':
D:\msys64\home\JW\watt32\src/../inc/sys/swap.h:63: multiple definition of `__ntohl'
lib\libwatt.a(pctcp.o):D:\msys64\home\JW\watt32\src/../inc/sys/swap.h:63: first defined here
lib\libwatt.a(ports.o): In function `_ntohs':
D:\msys64\home\JW\watt32\src/../inc/sys/swap.h:73: multiple definition of `__ntohs'
lib\libwatt.a(pctcp.o):D:\msys64\home\JW\watt32\src/../inc/sys/swap.h:73: first defined here
lib\libwatt.a(ports.o): In function `get_fs_reg':
D:\msys64\home\JW\watt32\src/misc.h:736: multiple definition of `get_fs_reg'
lib\libwatt.a(pctcp.o):D:\msys64\home\JW\watt32\src/misc.h:736: first defined here
lib\libwatt.a(ports.o): In function `get_gs_reg':
D:\msys64\home\JW\watt32\src/misc.h:744: multiple definition of `get_gs_reg'
lib\libwatt.a(pctcp.o):D:\msys64\home\JW\watt32\src/misc.h:744: first defined here
lib\libwatt.a(ports.o): In function `set_fs_reg':
D:\msys64\home\JW\watt32\src/misc.h:751: multiple definition of `set_fs_reg'
lib\libwatt.a(pctcp.o):D:\msys64\home\JW\watt32\src/misc.h:751: first defined here
lib\libwatt.a(ports.o): In function `set_gs_reg':
D:\msys64\home\JW\watt32\src/misc.h:757: multiple definition of `set_gs_reg'
lib\libwatt.a(pctcp.o):D:\msys64\home\JW\watt32\src/misc.h:757: first defined here
lib\libwatt.a(language.o): In function `_ntohl':
[... etc ...]
我一定是在这里做错了什么,但究竟是什么?这似乎是图书馆本身的问题..?
edit:这些函数在库源码中定义如下:(实现省略,都是内联汇编代码)
extern __inline__ WORD get_fs_reg (void) { /* ... */ }
extern __inline__ WORD get_gs_reg (void) { /* ... */ }
extern __inline__ void set_fs_reg (WORD sel) { /* ... */ }
extern __inline__ void set_gs_reg (WORD sel) { /* ... */ }
/*@unused@*/ extern __inline__ unsigned long __ntohl (unsigned long x) { /* ... */ }
/*@unused@*/ extern __inline__ unsigned short __ntohs (unsigned short x) { /* ... */ }
【问题讨论】:
-
问题可能出在头文件中的函数定义上。查看
misc.h中定义get_fs_reg和get_gs_reg的代码(可能在问题中发布该代码)。也许他们应该被标记为inline。此外,C 和 C++ 的行为方式也不同。内联函数。因此,如果此库是 C 库,则可能需要对标头进行一些更改才能从 C++ 中使用。 -
也尝试制作一个包含标题的 C 程序,看看是否出现相同的错误
-
@M.M,所有这些函数实际上都标记为
__inline__,并用-O2编译。我已将他们的定义添加到问题中。将测试文件编译为纯 C 并没有任何区别。 (我猜这使得 c++ 标签有些无关紧要) -
查看是否有更新版本的库和头文件。更改日志提到“misc.h 更改:Watcom 使用 'i64' 后缀来表示 64 位值。”。我想知道 32 位和 64 位函数是否都以某种方式被编译到同一个库中。 watt-32.net/change.log
标签: c++ gcc static-libraries