2015-06-27 2 views
-1

Я получаю сообщение об ошибке i686-w64-mingw32-gcc (см. Раздел) при связывании c-исходного файла с использованием CMake, содержащего вызов Sleep(). Я хотел бы знать причину этого, чтобы решить проблему.Функция, указанная в разделе `.text 'of ...: определена в отброшенном разделе` .text'

Это вызов компилятора:

/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 

Минимального урезанный рабочий образец:

main.c:

#include <windows.h> 

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

Компилятор/линкер вызов:

i686-w64-mingw32-gcc -static-libgcc -lpthread -lws2_32 -lkernel32 -luser32 -lgdi32 -lwinspool -lshell32 -lole32 -loleaut32 -luuid -lcomdlg32 -ladvapi32 -o main.exe main.c 

Нет проблем здесь.

ответ

0

Невероятно, мне просто нужно было #include <windows.h> в файле C, упомянутом первоначально, и он был связан без каких-либо хлопот.

+0

Почему это невероятно? Путем опущения '' вы пренебрегли сообщением компилятору, что 'Sleep()' является функцией '__stdcall', и, таким образом, его публично открытое имя фактически является' Sleep @ 4() '. Вы просто должны пренебрегать включением '', когда используете функции Windows API, потому что большинство из них - '__stdcall', а компилятор _needs_ - это знать. –

+0

Спасибо за объяснение! Это делает вещи намного яснее. – dubbaluga

+0

До сих пор я делал гораздо больше разработок в системах Linux/Unix, и, похоже, здесь не так уж сложно работать с вызовами функций, с именами функций в общих библиотеках и т. Д. – dubbaluga

Смежные вопросы