2013-09-23 98 views
1

我尝试用mingw编译一个简单的线程程序用于Win上的Linux。交叉编译用mingw在Linux上运行一个pthread

为此,我加载source并将源代码放到我的目录中。 比我写了一个makefile。对于Linux,它运行得非常好。但赢我有许多错误 - 他们中的一些我已经不能修复:

$ make 
x86_64-w64-mingw32-gcc -Wall -O3 -DPTW32_STATIC_LIB -FORCEWIN -c -o main.o main.c 
x86_64-w64-mingw32-gcc -Wall -O3 -DPTW32_STATIC_LIB -FORCEWIN -c -o usleep.o usleep.c 
------------------------------------------ 
clean up 
make clean 
make[1]: Betrete Verzeichnis '/mnt/prog' 
rm -f *.o *.obj *.exe 
make[1]: Verlasse Verzeichnis '/mnt/prog' 
------------------------------------------ 
compile pthreads as static lib 
cd ./pthreads/; \ 
    make CROSS=x86_64-w64-mingw32- clean GC-static 
make[1]: Betrete Verzeichnis '/mnt/prog/pthreads' 
rm -f *~ 
rm -f *.i 
rm -f *.s 
rm -f *.o 
rm -f *.obj 
rm -f *.exe 
rm -f pthread.def 
make XOPT="-DPTW32_BUILD_INLINED -DPTW32_STATIC_LIB" CLEANUP=-D__CLEANUP_C XC_FLAGS="  " OBJ="pthread.o version.o" libpthreadGC2.stamp 
make[2]: Betrete Verzeichnis '/mnt/prog/pthreads' 
x86_64-w64-mingw32-gcc -c -o pthread.o -D__CLEANUP_C -O3 -DPTW32_BUILD_INLINED -DPTW32_STATIC_LIB -I. -DHAVE_PTW32_CONFIG_H -Wall pthread.c 
x86_64-w64-mingw32-windres --include-dir=. -D__CLEANUP_C -o version.o -i version.rc 
rm -f libpthreadGC2.a 
x86_64-w64-mingw32-ar -rv libpthreadGC2.a pthread.o version.o 
x86_64-w64-mingw32-ar: Erzeugen von libpthreadGC2.a 
a - pthread.o 
a - version.o 
x86_64-w64-mingw32-ranlib libpthreadGC2.a 
echo touched > libpthreadGC2.stamp 
make[2]: Verlasse Verzeichnis '/mnt/prog/pthreads' 
make[1]: Verlasse Verzeichnis '/mnt/prog/pthreads' 
x86_64-w64-mingw32-gcc -c ./main.c ./usleep.c -Wall -O3 -DPTW32_STATIC_LIB -FORCEWIN 
------------------------------------------ 
create object files 
usleep.o main.o 
------------------------------------------ 
linking 
x86_64-w64-mingw32-gcc ./main.o ./usleep.o ./pthreads/pthread.o -o possix.exe 
./usleep.o:usleep.c:(.text+0x3c): undefined reference to `__imp_select' 
./usleep.o:usleep.c:(.text+0x8c): undefined reference to `__imp_select' 
/usr/bin/x86_64-w64-mingw32-ld: ./usleep.o: Falsche Verschiebungsadresse 0x0 in Abschnitt `.pdata' 
/usr/bin/x86_64-w64-mingw32-ld: final link failed: Ungültiger Vorgang 
collect2: ld returned 1 exit status 
make: *** [prog] Fehler 1 

我如何解决这个问题的链接?


到达亚尔RAI

的包括我的头是(按顺序,我认为,他们被称为):

的main.c

/*#include <errno.h> */ 
/*#include <fcntl.h> */ 
#include <inttypes.h> 
#include "./pthreads/pthread.h" 
#include <stdio.h>  
#include <stdlib.h> 
#include <string.h> 
/*#include <termios.h> */ 
/*#include <unistd.h> */ 

#include "usleep.h"  /* um usleep nutzen zu können */ 

usleep.h

... 
#include "unistd.h" 
#include <inttypes.h> 
#include <stdio.h> 
... 

可能是因为windows目标包含unistd.h是错误的吗?


我还额外减少标题的数量并在任何可能的情况下更改它们的顺序,但错误仍然存​​在。我不知道它来自....

的main.c

#include <inttypes.h> /* Spezielle int-Datentypen */ 
#include <stdio.h> 

#if defined(FORCEWIN) || defined(_WIN64) || defined(_WIN32) 
    #include <time.h> 
    #include <winsock2.h> 
#elif __unix /* all unices not caught above */ 
    #include <sys/time.h> 
    #include <sys/socket.h> 
#endif 

usleep.h


英语反馈

LC_ALL=C make 
------------------------------------------ 
clean up 
make clean 
make[1]: Entering directory `/mnt/prog' 
rm -f *.o *.obj *.exe 
make[1]: Leaving directory `/mnt/prog' 
------------------------------------------ 
compile pthreads as static lib 
cd ./pthreads/; \ 
    make CROSS=x86_64-w64-mingw32- clean GC-static 
make[1]: Entering directory `/mnt/prog/pthreads' 
rm -f *~ 
rm -f *.i 
rm -f *.s 
rm -f *.o 
rm -f *.obj 
rm -f *.exe 
rm -f pthread.def 
make XOPT="-DPTW32_BUILD_INLINED -DPTW32_STATIC_LIB" CLEANUP=-D__CLEANUP_C XC_FLAGS=" " OBJ="pthread.o version.o" libpthreadGC2.stamp 
make[2]: Entering directory `/mnt/prog/pthreads' 
x86_64-w64-mingw32-gcc -c -o pthread.o -D__CLEANUP_C -O3 -DPTW32_BUILD_INLINED -DPTW32_STATIC_LIB -I. -DHAVE_PTW32_CONFIG_H -Wall pthread.c 
x86_64-w64-mingw32-windres --include-dir=. -D__CLEANUP_C -o version.o -i version.rc 
rm -f libpthreadGC2.a 
x86_64-w64-mingw32-ar -rv libpthreadGC2.a pthread.o version.o 
x86_64-w64-mingw32-ar: creating libpthreadGC2.a 
a - pthread.o 
a - version.o 
x86_64-w64-mingw32-ranlib libpthreadGC2.a 
echo touched > libpthreadGC2.stamp 
make[2]: Leaving directory `/mnt/prog/pthreads' 
make[1]: Leaving directory `/mnt/prog/pthreads' 
------------------------------------------ 
create object files 
x86_64-w64-mingw32-gcc -c ./main.c ./usleep.c -Wall -O3 -DPTW32_STATIC_LIB -FORCEWIN 
usleep.o main.o 
------------------------------------------ 
linking 
x86_64-w64-mingw32-gcc ./main.o ./usleep.o ./pthreads/pthread.o -o possix.exe 
./usleep.o:usleep.c:(.text+0x3c): undefined reference to `__imp_select' 
./usleep.o:usleep.c:(.text+0x8c): undefined reference to `__imp_select' 
/usr/bin/x86_64-w64-mingw32-ld: ./usleep.o: bad reloc address 0x0 in section `.pdata' 
/usr/bin/x86_64-w64-mingw32-ld: final link failed: Invalid operation 
collect2: ld returned 1 exit status 
make: *** [prog] Error 1 

我已经从CFLAGS删除了-DPTW32_STATIC_LIB现在我得到这个

LC_ALL=C make 
------------------------------------------ 
clean up 
make clean 
make[1]: Entering directory `/mnt/prog' 
rm -f *.o *.obj *.exe 
make[1]: Leaving directory `/mnt/prog' 
------------------------------------------ 
compile pthreads as static lib 
cd ./pthreads/; \ 
    make CROSS=x86_64-w64-mingw32- clean GC-static 
make[1]: Entering directory `/mnt/prog/pthreads' 
rm -f *~ 
rm -f *.i 
rm -f *.s 
rm -f *.o 
rm -f *.obj 
rm -f *.exe 
rm -f pthread.def 
make XOPT="-DPTW32_BUILD_INLINED -DPTW32_STATIC_LIB" CLEANUP=-D__CLEANUP_C XC_FLAGS=" " OBJ="pthread.o version.o" libpthreadGC2.stamp 
make[2]: Entering directory `/mnt/prog/pthreads' 
x86_64-w64-mingw32-gcc -c -o pthread.o -D__CLEANUP_C -O3 -DPTW32_BUILD_INLINED -DPTW32_STATIC_LIB -I. -DHAVE_PTW32_CONFIG_H -Wall pthread.c 
x86_64-w64-mingw32-windres --include-dir=. -D__CLEANUP_C -o version.o -i version.rc 
rm -f libpthreadGC2.a 
x86_64-w64-mingw32-ar -rv libpthreadGC2.a pthread.o version.o 
x86_64-w64-mingw32-ar: creating libpthreadGC2.a 
a - pthread.o 
a - version.o 
x86_64-w64-mingw32-ranlib libpthreadGC2.a 
echo touched > libpthreadGC2.stamp 
make[2]: Leaving directory `/mnt/prog/pthreads' 
make[1]: Leaving directory `/mnt/prog/pthreads' 
------------------------------------------ 
create object files 
x86_64-w64-mingw32-gcc -c ./main.c ./usleep.c -Wall -O3 -FORCEWIN 
usleep.o main.o 
------------------------------------------ 
linking 
x86_64-w64-mingw32-gcc ./main.o ./usleep.o ./pthreads/pthread.o -o possix.exe -v 
Using built-in specs. 
COLLECT_GCC=x86_64-w64-mingw32-gcc 
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-w64-mingw32/4.6/lto-wrapper 
Target: x86_64-w64-mingw32 
Configured with: ../../src/configure --build=x86_64-linux-gnu --prefix=/usr --includedir='/usr/include' --mandir='/usr/share/man' --infodir='/usr/share/info' --sysconfdir=/etc --localstatedir=/var --libexecdir='/usr/lib/gcc-mingw-w64' --disable-maintainer-mode --disable-dependency-tracking --prefix=/usr --enable-shared --enable-static --disable-multilib --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --libdir=/usr/lib --enable-libstdcxx-time=yes --with-tune=generic --enable-version-specific-runtime-libs --enable-threads=win32 --enable-fully-dynamic-string --enable-sjlj-exceptions --enable-languages=c,c++,fortran,objc,obj-c++,ada --enable-lto --with-plugin-ld --target=x86_64-w64-mingw32 --with-gxx-include-dir=/usr/include/c++/4.6 --with-as=/usr/bin/x86_64-w64-mingw32-as --with-ld=/usr/bin/x86_64-w64-mingw32-ld 
Thread model: win32 
gcc version 4.6.3 (GCC) 
COMPILER_PATH=/usr/lib/gcc/x86_64-w64-mingw32/4.6/:/usr/lib/gcc/x86_64-w64-mingw32/4.6/:/usr/lib/gcc/x86_64-w64-mingw32/:/usr/lib/gcc/x86_64-w64-mingw32/4.6/:/usr/lib/gcc/x86_64-w64-mingw32/ 
LIBRARY_PATH=/usr/lib/gcc/x86_64-w64-mingw32/4.6/:/usr/lib/gcc/x86_64-w64-mingw32/4.6/../../../../x86_64-w64-mingw32/lib/ 
COLLECT_GCC_OPTIONS='-o' 'possix.exe' '-v' '-mtune=generic' '-march=x86-64' 
/usr/lib/gcc/x86_64-w64-mingw32/4.6/collect2 -m i386pep -Bdynamic -o possix.exe /usr/lib/gcc/x86_64-w64-mingw32/4.6/../../../../x86_64-w64-mingw32/lib/crt2.o /usr/lib/gcc/x86_64-w64-mingw32/4.6/../../../../x86_64-w64-mingw32/lib/crtbegin.o -L/usr/lib/gcc/x86_64-w64-mingw32/4.6 -L/usr/lib/gcc/x86_64-w64-mingw32/4.6/../../../../x86_64-w64-mingw32/lib ./main.o ./usleep.o ./pthreads/pthread.o -lmingw32 -lgcc_eh -lgcc -lmoldname -lmingwex -lmsvcrt -ladvapi32 -lshell32 -luser32 -lkernel32 -lmingw32 -lgcc_eh -lgcc -lmoldname -lmingwex -lmsvcrt /usr/lib/gcc/x86_64-w64-mingw32/4.6/../../../../x86_64-w64-mingw32/lib/crtend.o 
./main.o:main.c:(.text+0x1c): undefined reference to `__imp_pthread_mutex_lock' 
./main.o:main.c:(.text+0x23): undefined reference to `__imp_pthread_mutex_unlock' 
./main.o:main.c:(.text+0x6b): undefined reference to `__imp_pthread_exit' 
./main.o:main.c:(.text+0x8b): undefined reference to `__imp_pthread_mutex_lock' 
./main.o:main.c:(.text+0x9e): undefined reference to `__imp_pthread_mutex_unlock' 
./main.o:main.c:(.text+0x19c): undefined reference to `__imp_pthread_exit' 
/usr/bin/x86_64-w64-mingw32-ld: ./main.o: bad reloc address 0x0 in section `.pdata' 
/usr/bin/x86_64-w64-mingw32-ld: final link failed: Invalid operation 
collect2: ld returned 1 exit status 
make: *** [prog] Error 1 

它看起来对我来说,从并行线程困惑


未来一个错误在谈到由加文·史密斯的评论下面我已经做了在Makefile中的一些变化:

$ LC_ALL=C make 
------------------------------------------ 
clean up 
make clean 
make[1]: Entering directory `/mnt/prog' 
rm -f *.o *.obj *.exe 
make[1]: Leaving directory `/mnt/prog' 
------------------------------------------ 
compile pthreads as static lib 
cd ./pthreads/; \ 
    make CROSS=x86_64-w64-mingw32- clean GC-static -v 
GNU Make 3.81 
Copyright (C) 2006 Free Software Foundation, Inc. 
This is free software; see the source for copying conditions. 
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A 
PARTICULAR PURPOSE. 

This program built for x86_64-pc-linux-gnu 
------------------------------------------ 
create object files 
x86_64-w64-mingw32-gcc -c ./main.c ./usleep.c -Wall -g -O3 -FORCEWIN 
usleep.o main.o 
------------------------------------------ 
linking 
x86_64-w64-mingw32-ld ./main.o ./usleep.o ./pthreads/libpthreadGC2.a -o possix.exe -v 
GNU ld (GNU Binutils) 2.22.90.20120919 
./main.o: In function `thr_ausgabe': 
/mnt/prog/./main.c:66: undefined reference to `__imp_pthread_mutex_lock' 
/mnt/prog/./main.c:66: undefined reference to `__imp_pthread_mutex_unlock' 
/mnt/prog/./main.c:72: undefined reference to `printf' 
/mnt/prog/./main.c:83: undefined reference to `__imp_pthread_exit' 
./main.o: In function `thr_arbeite': 
/mnt/prog/./main.c:44: undefined reference to `__imp_pthread_mutex_lock' 
/mnt/prog/./main.c:46: undefined reference to `__imp_pthread_mutex_unlock' 
/mnt/prog/./main.c:56: undefined reference to `__imp_pthread_exit' 
./main.o: In function `main': 
/mnt/prog/./main.c:89: undefined reference to `__main' 
/mnt/prog/./main.c:100: undefined reference to `__imp_pthread_mutex_init' 
/mnt/prog/./main.c:105: undefined reference to `__imp_pthread_create' 
/mnt/prog/./main.c:116: undefined reference to `__imp_pthread_join' 
/mnt/prog/./main.c:111: undefined reference to `__imp___iob_func' 
/mnt/prog/./main.c:111: undefined reference to `fprintf' 
/mnt/prog/./main.c:106: undefined reference to `__imp___iob_func' 
/mnt/prog/./main.c:106: undefined reference to `fprintf' 
./usleep.o: In function `msleep': 
/mnt/prog/./usleep.c:16: undefined reference to `__imp_select' 
./usleep.o: In function `usleep': 
/mnt/prog/./usleep.c:33: undefined reference to `__imp_select' 
make: *** [prog] Error 1 

主要的符号现在是:

$ x86_64-w64-mingw32-nm main.o 
0000000000000000 b .bss 
0000000000000000 d .data 
0000000000000000 N .debug_abbrev 
0000000000000000 N .debug_aranges 
0000000000000000 N .debug_frame 
0000000000000000 N .debug_info 
0000000000000000 N .debug_line 
0000000000000000 N .debug_loc 
0000000000000000 N .debug_ranges 
       U fprintf 
       U __imp___iob_func 
       U __imp_pthread_create 
       U __imp_pthread_exit 
       U __imp_pthread_join 
       U __imp_pthread_mutex_init 
       U __imp_pthread_mutex_lock 
       U __imp_pthread_mutex_unlock 
0000000000000000 T main 
       U __main 
       U msleep 
0000000000000000 p .pdata 
0000000000000000 p .pdata.startup 
       U printf 
0000000000000000 r .rdata 
0000000000000000 t .text 
0000000000000000 t .text.startup 
0000000000000080 T thr_arbeite 
0000000000000000 T thr_ausgabe 
0000000000000000 r .xdata 
0000000000000000 r .xdata.startup 

我看在lib的objectfile太的发现符号主要有一点不同:

000000000000a9c0 T pthread_create 
000000000000e6a0 T pthread_exit 
000000000000b510 T pthread_join 
00000000000024b0 T pthread_mutex_init 
0000000000006c70 T pthread_mutex_lock 
0000000000005800 T pthread_mutex_unlock 

可能剥离或目标文件重命名符号它是有用的?


实际情况:

终端:在目标文件

$ x86_64-w64-mingw32-nm main.o 
0000000000000000 b .bss 
0000000000000000 d .data 
       U fprintf 
       U __imp___iob_func 
0000000000000000 T main 
       U __main 
       U msleep 
0000000000000000 p .pdata 
0000000000000000 p .pdata.startup 
       U printf 
       U pthread_create 
       U pthread_exit 
       U pthread_join 
       U pthread_mutex_init 
       U pthread_mutex_lock 
       U pthread_mutex_unlock 
0000000000000000 r .rdata 
0000000000000000 t .text 
0000000000000000 t .text.startup 
0000000000000080 T thr_arbeite 
0000000000000000 T thr_ausgabe 
0000000000000000 r .xdata 
0000000000000000 r .xdata.startup 

$ LC_ALL=C make 
------------------------------------------ 
clean up 
make clean 
make[1]: Entering directory `/mnt/prog/win' 
rm -f *.o *.obj *.exe 
make[1]: Leaving directory `/mnt/prog/win' 
------------------------------------------ 
create object files 
x86_64-w64-mingw32-gcc -c ./main.c ./usleep.c -Wall -O3 -DPTW32_STATIC_LIB -FORCEWIN 
usleep.o main.o 
------------------------------------------ 
compile pthreads as static lib 
cd ./pthreads/; \ 
    make CROSS=x86_64-w64-mingw32- clean GC-static 
make[1]: Entering directory `/mnt/prog/win/pthreads' 
rm -f *~ 
rm -f *.i 
rm -f *.s 
rm -f *.o 
rm -f *.obj 
rm -f *.exe 
rm -f pthread.def 
make XOPT="-DPTW32_BUILD_INLINED -DPTW32_STATIC_LIB" CLEANUP=-D__CLEANUP_C XC_FLAGS=" " OBJ="pthread.o version.o" libpthreadGC2.stamp 
make[2]: Entering directory `/mnt/prog/win/pthreads' 
x86_64-w64-mingw32-gcc -c -o pthread.o -D__CLEANUP_C -O3 -DPTW32_BUILD_INLINED -DPTW32_STATIC_LIB -I. -DHAVE_PTW32_CONFIG_H -Wall pthread.c 
x86_64-w64-mingw32-windres --include-dir=. -D__CLEANUP_C -o version.o -i version.rc 
rm -f libpthreadGC2.a 
x86_64-w64-mingw32-ar -rv libpthreadGC2.a pthread.o version.o 
x86_64-w64-mingw32-ar: creating libpthreadGC2.a 
a - pthread.o 
a - version.o 
x86_64-w64-mingw32-ranlib libpthreadGC2.a 
echo touched > libpthreadGC2.stamp 
make[2]: Leaving directory `/mnt/prog/win/pthreads' 
make[1]: Leaving directory `/mnt/prog/win/pthreads' 
------------------------------------------ 
linking 
x86_64-w64-mingw32-ld ./main.o ./usleep.o ./pthreads/libpthreadGC2.a -o possix.exe 
./main.o:main.c:(.text+0x33): undefined reference to `printf' 
./main.o:main.c:(.text.startup+0x6): undefined reference to `__main' 
x86_64-w64-mingw32-ld: ./main.o: bad reloc address 0x6 in section `.text.startup' 
x86_64-w64-mingw32-ld: final link failed: Invalid operation 
make: *** [prog] Error 1 

符号我真的不明白为什么他不能找到的printf和主....

usleep.o

$ x86_64-w64-mingw32-nm usleep.o 
0000000000000000 b .bss 
0000000000000000 d .data 
       U __imp_select 
0000000000000000 T msleep 
0000000000000000 p .pdata 
0000000000000000 t .text 
0000000000000050 T usleep 
0000000000000000 r .xdata 
+0

根据gcc规则'如果任何[静态]库A依赖于库B中定义的符号,则库A应该首先出现在提供给链接器的列表中。“请检查源文件的顺序是否有任何不匹配和你的build命令中的库。 –

+0

为了让你的编译器错误可以被不懂德语的人阅读,运行'LC_ALL = C make'。 –

+0

谢谢 - 我会添加这个 – Alex44

回答

1

错误:

./usleep.o:usleep.c:(.text+0x3c): undefined reference to `__imp_select' 

意味着符号__imp_select没有定义。它可能在其他一些C文件中,您没有包含在最终的链接步骤中。

+0

是的,我理解它的方式,但没有什么'grep -e __imp_select *'什么都不给我。 – Alex44

+0

http://stackoverflow.com/questions/6356123/where-to-find-select-source-code-in-glibc-source –

+0

在我看来,这是正确的方向。但我无法修复它。我必须添加编译器标志,以便找到lib。在上面的链接中,它意味着包含“glibc” - 但没有任何事情发生.... – Alex44

1

它看起来像你已经创建了一个静态库文件libpthreadGC2.a,但你的链接命令x86_64-w64-mingw32-gcc ./main.o ./usleep.o ./pthreads/pthread.o -o possix.exe -v只链接三个目标文件,它不在其中。尝试将-lpthreadGC2libpthreadGC2.a添加到链接命令。

如果要检查目标文件是否包含缺少的符号(例如__imp_pthread_mutex_unlock),则可以尝试运行nm libpthreadGC2.a | grep '__imp_pthread_mutex_unlock'以查看它是否存在。

我在自述文件中阅读了链接到的pthread源文件,您必须在构建时定义PTW32_STATIC_LIB - 是否存在删除-DPTW32_STATIC_LIB选项的原因?

+0

我无法确定目标文件的格式。 nm总是告诉'文件格式不被识别'。顺便一提。有可能通过其他选择制作pthread-lib。有_dll C清理code_,_inlined dll C清理code_和_inlined静态库C清理code_。我应该使用另一个? – Alex44

+0

在调试模式中,我看到所有的possix命令都是未定义的引用。在手动pf pthread中,它说我必须使用CFLAG -pthread - 但是如果我使用它,编译器不会找到lib:'x86_64-w64-mingw32-gcc:error:无法识别的选项'-pthread'' – Alex44

+0

如果我使用'x86_64-w64-mingw32-nm main.o'而不是'nm'它可能会查看目标文件:) 我会将这些响应添加到问题中... – Alex44