C++ GCC“;“多重定义”;与外部库链接时出错

C++ GCC“;“多重定义”;与外部库链接时出错,c++,gcc,static-libraries,C++,Gcc,Static Libraries,我正在尝试使用一个库(Watt-32,如果相关的话),它由于某种原因无法链接。我已经编译了库,作为一个快速的“hello world”测试,我正在尝试编译以下文件: #include <tcp.h> int main() { sock_init(); } 我一定是做错了什么,但到底是什么?这似乎是图书馆本身的问题 编辑:这些函数在库源代码中定义如下:(省略了实现,它都是内联汇编代码) 也许您需要?这些头文件有点旧/过时。使用较新的编译器时,extern inline的用法发生了变

我正在尝试使用一个库(Watt-32,如果相关的话),它由于某种原因无法链接。我已经编译了库,作为一个快速的“hello world”测试,我正在尝试编译以下文件:

#include <tcp.h>
int main() { sock_init(); } 
我一定是做错了什么,但到底是什么?这似乎是图书馆本身的问题

编辑:这些函数在库源代码中定义如下:(省略了实现,它都是内联汇编代码)


也许您需要?

这些头文件有点旧/过时。使用较新的编译器时,
extern inline
的用法发生了变化<代码>外部内联是多年来的首选方式。它在
gcc
上运行良好,但是
clang
需要
static inline

现在,即使是
gcc
也需要
静态内联
,即使是使用-O2,您也可以得到您所看到的。由于您是从源代码处重新编译的,因此可能需要编辑.h并将它们全部更改为
静态

我的代码样板是
#define craigs_inline extern inline
,现在我把它切换到
#define craigs_inline static inline
,以保持平静


请注意,我没有研究编译器选项,也没有研究任何可能会消除这种需要的选项。如果您找到了,请向我发送一条评论,我很想知道。

问题可能是头文件中的函数定义。看看
misc.h
中定义了
get\u fs\u reg
get\u gs\u reg
的代码(可能在问题中发布该代码)。可能它们在应该标记时没有标记为
inline
。此外,C和C++的行为不同于W.R.T.内联函数。因此,如果这个库是C库,那么头文件可能需要一些更改以从C++中使用。up@M.M,所有这些函数实际上都被标记为
\uuuuuu inline\uuuu
,并用-O2编译。我已经在问题中添加了它们的定义。将测试文件编译为纯C没有任何区别。(我猜想这会使C++标签有些不相关)看看是否有一个更新的库和头文件。变更日志中提到“misc.h变更:Watcom对64位值使用'i64'后缀。”。我想知道32位和64位函数是否都以某种方式编译到同一个库中。在我看来,这似乎是一个链接器错误。也许先用gcc-c编译,然后才编译-这应该证明是库链接失败了..我在挖掘系统头时发现了这一点,系统头使用
extern\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu属性((uuuuuuuuuuu gnu\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。
中的注释指出,此属性相当于使用
-fgnu89内联编译。是的,使用此选项重新编译Watt32库后,我的测试文件也会编译,不会出现错误!:)@用户5434231谢谢!!!正如柯克上尉曾经对斯科蒂说的那样:你已经为这周赚了钱。更多信息:在C语言中,C99之前官方没有
inline
。GCC推出了自己的;对于同一代码,C99内联与gnu89具有不同的行为。一团糟。C++又不同了。这个代码库是为GNU89N而写的,但是被编译成C99。我对便携代码的建议是不使用从C和C++中包含的头文件中的内联函数;然而在实践中,我认为你可以在所有方言中使用
静态内联
。是的,这是一个混乱。我的代码实现了#ifdef's on CLANG、优化cplusplus GNUC等功能,并定义了我在回答中提到的抽象宏。只有一个地方(而且只有一个地方)这样做,其他每个.h文件都使用摘要。这已经并确实起作用了。所以,不是一团糟。对于新情况,我添加了新的#ifdef[和/或simplify]。摘要可以由autoconf定义,等等。顺便说一句,我在写内联代码的第一天就定义了摘要,[~20年前],因为我预先看到了这个问题。不是唯一的,其他的也一样。
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 ...]
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) { /* ... */ }