Gcc 第`.text'节中引用的函数;of…:定义在丢弃的部分“.text';

Gcc 第`.text'节中引用的函数;of…:定义在丢弃的部分“.text';,gcc,mingw,Gcc,Mingw,当使用包含对Sleep()调用的CMake链接c源文件时,我从i686-w64-mingw32-gcc(请参见主题)得到一个错误。为了解决这个问题,我想知道原因 这是编译器的调用: /usr/bin/i686-w64-mingw32-gcc -g @CMakeFiles/MQTTAsync_publish.dir/includes_C.rsp -o CMakeFiles/MQTTAsync_publish.dir/src/samples/MQTTAsync_publish.c.obj

当使用包含对
Sleep()
调用的CMake链接c源文件时,我从
i686-w64-mingw32-gcc
(请参见主题)得到一个错误。为了解决这个问题,我想知道原因

这是编译器的调用:

/usr/bin/i686-w64-mingw32-gcc   -g @CMakeFiles/MQTTAsync_publish.dir/includes_C.rsp   -o CMakeFiles/MQTTAsync_publish.dir/src/samples/MQTTAsync_publish.c.obj   -c /tmp/org.eclipse.paho.mqtt.c/src/samples/MQTTAsync_publish.c
建筑师:

/usr/bin/i686-w64-mingw32-ar cr CMakeFiles/MQTTAsync_publish.dir/objects.a @CMakeFiles/MQTTAsync_publish.dir/objects1.rsp
链接器:

/usr/bin/i686-w64-mingw32-gcc  -g  -fdata-sections -ffunction-sections -Wl,--enable-stdcall-fixup -static-libgcc -Wl,--whole-archive CMakeFiles/MQTTAsync_publish.dir/objects.a -Wl,--no-whole-archive  -o MQTTAsync_publish.exe -Wl,--out-implib,libMQTTAsync_publish.dll.a -Wl,--major-image-version,0,--minor-image-version,0 @CMakeFiles/MQTTAsync_publish.dir/linklibs.rsp
`_Sleep' referenced in section `.text' of CMakeFiles/MQTTAsync_publish.dir/objects.a(MQTTAsync_publish.c.obj): defined in discarded section `.text' of /usr/lib/gcc/i686-w64-mingw32/4.9-win32/../../../../i686-w64-mingw32/lib/../lib/libkernel32.a(libkernel32s01140.o)
以下是链接器响应文件的内容:

 libpaho-mqtt3a.dll.a -lpthread -lws2_32 -lkernel32 -luser32 -lgdi32 -lwinspool -lshell32 -lole32 -loleaut32 -luuid -lcomdlg32 -ladvapi32
最小剥离工作样本:

主要条款c:

#include <windows.h>

int main(void)
{
    Sleep(10);
    return 0;
}

没问题

难以置信,我只需将包含在最初提到的C文件中,就可以轻松链接

为什么难以置信?通过省略
,您忽略了通知编译器
Sleep()
是一个
\uu stdcall
函数,因此它公开的名称实际上是
Sleep@4()
。在使用Windows API函数时,千万不要忽略包含
,因为大多数函数都是
\uu stdcall
,编译器需要知道这一点。感谢您的解释!这让事情变得更清楚了。到目前为止,我在Linux/Unix系统上做了更多的开发,似乎函数调用约定、共享库中的函数名损坏等都不是什么大问题。
\u stdcall
是MS Windows特有的(大多数Windows API函数都使用它)。然而,即使您主要为Linux开发,这也不能免除您包含必要的头文件的责任;这是一个编程错误。当然,您可以只使用
sleep()
,它现在是从mingwrt-3.21.1开始为MinGW实现的(但不是在破的4.x版本中),只要您包含
。您是对的。在这种情况下,我期待编译器发出警告(
函数的隐式声明
)。但是,由于没有打开警告(
-Wall
),是链接器给了我一个错误。
i686-w64-mingw32-gcc -static-libgcc -lpthread -lws2_32 -lkernel32 -luser32 -lgdi32 -lwinspool -lshell32 -lole32 -loleaut32 -luuid -lcomdlg32 -ladvapi32 -o main.exe main.c