C 奇怪的posix消息队列链接问题-有时它不会';不能正确连接

C 奇怪的posix消息队列链接问题-有时它不会';不能正确连接,c,linux,gcc,posix,message-queue,C,Linux,Gcc,Posix,Message Queue,当我构建以下代码时,它构建得很好。如果我使用相同的命令行将代码改为注释掉“while”,则它不会生成(见下文) 更新: 看起来像是编译器版本的问题,我在不同的框中构建了相同的代码,并且它使用上述任一文件都能正确构建。所以我想我需要一个不同的编译器 dada@JoesPi ~ $ gcc -v Using built-in specs. COLLECT_GCC=gcc COLLECT_LTO_WRAPPER=/usr/lib/gcc/arm-linux-gnueabihf/4.6/lto-wra

当我构建以下代码时,它构建得很好。如果我使用相同的命令行将代码改为注释掉“while”,则它不会生成(见下文)

更新:

看起来像是编译器版本的问题,我在不同的框中构建了相同的代码,并且它使用上述任一文件都能正确构建。所以我想我需要一个不同的编译器

dada@JoesPi ~ $ gcc -v

Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/arm-linux-gnueabihf/4.6/lto-wrapper
Target: arm-linux-gnueabihf
Configured with: ../src/configure -v --with-pkgversion='Debian 4.6.3-14+rpi1' --with-bugurl=file:///usr/share/doc/gcc-4.6/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.6 --enable-shared --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.6 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --enable-plugin --enable-objc-gc --disable-sjlj-exceptions --with-arch=armv6 --with-fpu=vfp --with-float=hard --enable-checking=release --build=arm-linux-gnueabihf --host=arm-linux-gnueabihf --target=arm-linux-gnueabihf
Thread model: posix
gcc version 4.6.3 (Debian 4.6.3-14+rpi1)
“对mq_open的未定义引用”集合2:


与自由主义者的联系。例如,
-lrt

您可以使用$gcc-G-Wall-o mqtest mqtest.c-lrt对其进行编译,使其作为posix消息队列apia的未定义引用工作而不会出现编译错误。
(如评论中所述)

如果在c文件之前使用-lrt,则会出现错误

root@embsys-VirtualBox:~#gcc-lrt测试.c

/tmp/ccR93VIp.o:在函数
tfunc'中:
test.c:(.text+0x31):对
mq_getattr'的未定义引用 test.c:(.text+0x8f):对
mq\u receive'的未定义引用
/tmp/ccR93VIp.o:在功能中
main': test.c:(.text+0x145):对
mq\u open'的未定义引用
test.c:(.text+0x194):对
mq\u notify'的未定义引用 collect2:错误:ld返回了1个退出状态

这很有效


root@embsys-VirtualBox:~#gcc test.c-lrt

谢谢,我来自上层。。。“gcc-g-Wall-lrt-o mqtest mqtest.c”这就是奇怪的行为。。。上面的例子是构建的,下面的不是,完全相同的命令行…抱歉,我错过了。更改为
gcc-g-Wall-omqtest mqtest.c-lrt
。我无法重现你的问题。都编译好了。谢谢@Duck。看起来像是编译器版本的问题,我试过的前两个盒子也有同样的问题,第三个很好。将尝试修复坏框上的编译器。再次感谢-Joe@Duck我无法在pkg config中为g++指定lrt。它说找不到lrt图书馆。有什么想法吗?@Duck我在这里记录了上面的问题:看起来像是一个ciompiler verion问题,我在另一个盒子上构建了相同的代码,可能是编译器优化了它,因为
mq\u open
永远不会执行。@Duck看起来不是这样的,因为如果它被优化了,那么就不应该有未定义的符号,因为它实际上已经不存在了。您在上面说过,一旦您注释掉它,它就没有编译,但它已经在那里编译了。由于无休止的while循环,编译器可能只是将
mq_open
完全抛出,因此没有符号阻塞。对不起,我现在明白了。。。向后看你的评论,谢谢。我会尝试其他一些方法,看看情况是否如此。
dada@thud:~/RaspberryPI$ gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.6/lto-wrapper
Target: x86_64-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu/Linaro 4.6.3-1ubuntu5' --with-bugurl=file:///usr/share/doc/gcc-4.6/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.6 --enable-shared --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.6 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --enable-plugin --enable-objc-gc --disable-werror --with-arch-32=i686 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu
Thread model: posix
gcc version 4.6.3 (Ubuntu/Linaro 4.6.3-1ubuntu5)
dada@JoesPi ~ $ gcc -v

Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/arm-linux-gnueabihf/4.6/lto-wrapper
Target: arm-linux-gnueabihf
Configured with: ../src/configure -v --with-pkgversion='Debian 4.6.3-14+rpi1' --with-bugurl=file:///usr/share/doc/gcc-4.6/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.6 --enable-shared --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.6 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --enable-plugin --enable-objc-gc --disable-sjlj-exceptions --with-arch=armv6 --with-fpu=vfp --with-float=hard --enable-checking=release --build=arm-linux-gnueabihf --host=arm-linux-gnueabihf --target=arm-linux-gnueabihf
Thread model: posix
gcc version 4.6.3 (Debian 4.6.3-14+rpi1)