Articles of 链接

链接错误“未定义的参考”在编译期间关于boost静态库

我想用boost库1.57来编译Linux x64上的C ++项目。 这个项目是用scons编译的,我在Arch Linux上成功编译了,但是这次在Ubuntu机器上失败了。 我添加了-lboost_coroutine标志进行链接,但错误“未定义的引用”仍然存在。 /usr/bin/g++ -o build/gcc.release/app -pthread -g build/gcc.release/src/han/unity/rpcx.o -lpthread -lz -lboost_coroutine -lboost_context -lboost_date_time build/gcc.release/src/han/unity/rpcx.o: In function `attributes': /usr/local/include/boost/coroutine/attributes.hpp:31: undefined reference to `boost::coroutines::stack_traits::default_size()' 我注意到属性.hpp恰好是boost协程头文件之一。 我试图用nm来提升协程库,似乎没有问题。 nm /usr/local/lib/libboost_coroutine.a | grep "default_size" 0000000000000170 T _ZN5boost10coroutines12stack_traits12default_sizeEv 我search了这个错误的可能原因,大部分是关于链接器标志的顺序。 在这种情况下,rpcx.o取决于boost_coroutine,所以这出现在前面。 还有什么可能的原因?

编译64位Linux的32位GTK +应用程序

我在编译64位Linux(特别是Ubuntu 10.04)上的32位GTK +应用程序时遇到一些麻烦。 编译64位GTK +应用程序可以正常工作,并且所有设置都可以编译32位应用程序,但是它不适用于GTK + 我有一个非常简单的testing程序,我正在使用这个testing程序,它只是一个gtk_init和一个gtk_main,它编译成-m64。 我正在用gcc 4.6.2编译,调用它: gcc -m32 gtktest.c `pkg-config –cflags gtk+-2.0` `pkg-config –libs gtk+-2.0` 这些是我得到的两种不同的错误消息: /usr/local/lib/gcc/x86_64-unknown-linux-gnu/4.6.2/../../../../x86_64-unknown-linux-gnu/bin/ld: warning: libXext.so.6, needed by /usr/lib/../lib32/libgtk-x11-2.0.so, not found (try using -rpath or -rpath-link) 和 /usr/lib/../lib32/libgdk-x11-2.0.so: undefined reference to `XmbSetWMProperties' 请记住,这些不是唯一的错误,我只是包括两个特定types的参考,并保持它的简短,我得到整个GTK +库的错误。 我在我的lib32文件夹中拥有所有正确的32位版本的库。 希望有人以前有过这个问题,可以帮助我,这真的让我颇为头痛,而且我在网上的任何地方都帮不了什么忙。 请询问是否有任何其他信息需要我提供以帮助诊断此问题。 注:我有ia32-libs和gcc-multilib软件包。 Ubuntu 10.04没有单独的ia32-libs-gtk软件包,但是我认为它们被封装到ia32-libs软件包中。 他们都在我的系统上。 我认为这一定是某种链接器configuration问题。 我最近构build了新的Free Pascal编译器和一个32位交叉编译器,并且我还将GCC升级到了4.6.2,以便利用一些新的C ++特性并修复C99支持。 我的系统中仍然存在默认的4.4.3 GCC。 在我认为问题已经出现的时候,我安装了一个新的binutils,因为我一直在试验Clang和LLVM作为一个工具链,而且我想和ld提供插件function,所以我想不妨把它们全部升级。 一切工作正常编译64位程序,新工具根本没有一个单一的问题,我可以编译32位程序,但是当它来明确地链接的东西的时候我有问题。 […]

如何链接glibc的iconv的实现?

GNU C库提供了iconv的实现 – 我如何使用它? 简单的程序: #include <iconv.h> int main( int argc, char **argv ) { iconv_t cd = iconv_open( "UTF-8", "ISO-8859-1" ); iconv_close( cd ); return 0; } 编译和链接: $ gcc -Wall iconv.c -o iconv /tmp/ccKAfXNg.o: In function `main': iconv.c:(.text+0x19): undefined reference to `libiconv_open' iconv.c:(.text+0x29): undefined reference to `libiconv_close' collect2: ld returned 1 exit status […]

什么是ld-linux.so.2和linux-gate.so.1?

当我运行ldd program我得到了表单的输出 linux-gate.so.1 => (0xb77ae000) libstdc++.so.6 => /lib/libstdc++.so.6 (0xb76bc000) libm.so.6 => /lib/libm.so.6 (0xb7691000) libgcc_s.so.1 => /lib/libgcc_s.so.1 (0xb7674000) libc.so.6 => /lib/libc.so.6 (0xb74c2000) /lib/ld-linux.so.2 (0xb77af000) 你能解释一下输出和linux-gate.so.1和ld-linux.so.2 linux-gate.so.1显示不同于其他input的原因吗? 他们的angular色是什么?

Libusb未定义的参考

我正在尝试在我的操作系统上设置libusb API。 我在libusb.org上下载了libusb api。 我遵循标准的安装程序: cd into directory ./configure make make check //without errors make install 然后,我启动了Eclipse C / C ++,并从互联网上的教程中复制了一些代码。 但是当试图build立它时,我得到了以下输出: main.cpp:(.text+0x19): undefined reference to `libusb_init' main.cpp:(.text+0x76): undefined reference to `libusb_set_debug' main.cpp:(.text+0x8a): undefined reference to `libusb_get_device_list' main.cpp:(.text+0x136): undefined reference to `libusb_free_device_list' main.cpp:(.text+0x142): undefined reference to `libusb_exit' /tmp/ccOWJGwe.o: In function `printdev(libusb_device*)': main.cpp:(.text+0x162): undefined reference to […]

你如何链接到GCC中的特定版本的共享库

我正在编译一些在Debian Linux系统上使用libcurl的代码。 我的开发机器正在运行Debian 5,但我希望这个二进制文件也可以在早期的Debian 4系统上使用。 我发现,如果我指定-lcurl它将链接到libcurl.so.4,但Debian 4系统只有libcurl.so.3 有什么办法可以告诉GCC链接到libcurl.so.3(它存在于Debian 4和5中),或者只是libcurl.so,所以它会使用任何可用的版本?

如何在特殊的PowerShell链命令4命令提示符?

通常,PowerShell命令可以用分号链接。 以下打开2个记事本: PS> notepad; notepad 你也可以链接一个更复杂的语句: PS> Add-Type -AssemblyName System.IO.Compression; ` > $src = "C:\aFolder"; $zip="C:\my.zip"; ` > [io.compression.zipfile]::CreateFromDirectory($src, $zip) 链式PowerShell命令也可以从CMD命令行调用: C:\> powershell notepad; notepad 本文描述了一个创build.Net 4.0 PowerShell提示符的方法,即使.Net 2.0是您的操作系统上的活动框架。 您创build一个.cmd脚本,并运行该脚本。 现在你在.Net 4.0环境中。 链接也适用于4.0提示: C:\> ps4.cmd PS> notepad; notepad 也可以从标准CMD提示符下运行: C:\> ps4 notepad; notepad 本文描述了一种将Add-Type到显式path名的方法(需要从ps4提示符引用4.0程序集): Add-Type -Path "C:\Windows\Microsoft.NET\assembly\GAC_MSIL\System.IO.Compression.FileSystem\v4.0_4.0.0.0__b77a5c561934e089\System.IO.Compression.FileSystem.dll" 即使在ps4提示符处链接时,也是如此: C:\> ps4 PS> Add-Type -Path "C:\x\System.IO.Compression.FileSystem.dll"; ` […]