Articles of 静态链接

静态链接 – 使用GTKmm应用程序? – 修改

是否可以在Gtk(mm)程序上进行静态链接(编译)? 我需要程序减less对用户系统依赖的中继。 我尝试: g++ -static data/Area.h data/Picture.cpp data/GLScene.cpp data/KBDialog.cpp data/Dialogs.h data/FilePreview.cpp data/MainWindow.cpp prog.cpp -o prog `pkg-config –cflags –libs gtkmm-2.4 gtkglextmm-1.2 exiv2` 但是它失败了: /usr/bin/ld: cannot find -lgtkmm-2.4 /usr/bin/ld: cannot find -lGL /usr/bin/ld: cannot find -latkmm-1.6 /usr/bin/ld: cannot find -lgdkmm-2.4 /usr/bin/ld: cannot find -lpangomm-1.4 /usr/bin/ld: cannot find -lgdk_pixbuf-2.0 /usr/lib/gcc/i686-linux-gnu/4.4.5/../../../../lib/libgio-2.0.a(glocalfileinfo.o): In function `lookup_gid_name': (.text+0x207a): warning: Using 'getgrgid_r' in […]

在Linux上编译一个共享库来定位所有发行版

我们想要创build一个共享库(.so)来定位所有的发行版,包括旧发行版。 代码是用C ++编写的,使用C ++ 11的特性,所以编译器必须至less是gcc 4.7。 我们注意到,如果我们在安装了gcc 4.7.2的Linux机器上编译我们的代码(例如,Ubuntu 12.10),那么.so生成的版本为“版本1(GNU / Linux)”,而在旧的操作系统上(例如CentOS 5.6)版本是“版本1(SYSV)” – GNU / Linux较新版本的库不能在旧的操作系统上使用。 所以我们尝试了在CentOS 5.6机器上安装gcc 4.7的方法,用这个编译器编译我们的代码,并且用libstdc ++(-static-libstdc ++)静态链接 – 这样就产生了一个.so,在我们发现的每个linux上都可以使用。 这对32位工作正常。 但是,当我们在64位操作系统(CentOS)上遵循相同的方法时,这个失败的错误是我们试图链接的现有libstdc ++。a编译时没有使用-fPIC。 所以我们试着用“-with-pic”选项来编译gcc 4.7.2源代码,但是我们不能链接到新的libstdc ++。a – 错误是: /opt/centos/devtoolset-1.1/root/usr/libexec/gcc/x86_64-CentOS-linux/4.7.2/ld:/usr/local/lib/libFoo.so:版本节点找不到符号_ZNSs7_M_copyEPcPKcm @ GLIBCXX_3。 4 /opt/centos/devtoolset-1.1/root/usr/libexec/gcc/x86_64-CentOS-linux/4.7.2/ld:未设置dynamic区段大小:错误值collect2:错误:ld返回1退出状态 我们search了编译libstdc ++与-fPIC可能会有问题,但为什么它适用于32位而不是64位的操作系统? 是否有另一种build议的方式来创build一个.so所有的Linux发行版?

试图静态链接提升

我正在使用Boost库在Linux,Eclipse CDT,g ++中工作。 现有的使用Boost线程的程序,我尝试静态而不是dynamic地链接它。 / usr / local / lib目录包含以下文件: libbost_thread.a libbost_thread.so libbost_thread.1.41.0 dynamic链接工作: g++ -o"MyProgram" ./main.o -lboost_thread 静态链接: g++ -static -o"MyProgram" ./main.o -lboost_thread 产生大量的消息,如: 未定义的引用'pthread_mutex_init' 我怎样才能静态链接到Boost库?

我如何告诉cmake我想我的项目静态链接库?

我正在尝试使用在Linux上运行的CMake构build一个基于OpenCV的项目。 到目前为止,我的CMakeLists.txt文件看起来像 FIND_PACKAGE (OpenCV REQUIRED) … TARGET_LINK_LIBRARIES (my-executable ${OpenCV_LIBS}) 但是这会导致dynamic链接的库。 我如何链接静态库?

为什么不能完全静态地链接一个应用程序?

我试图用GCC编译一个静态链接的二进制文件,并得到如下警告消息: warning: Using 'getpwnam_r' in statically linked applications requires at runtime the shared libraries from the glibc version used for linking 我甚getwnam_r不知道getwnam_r是做什么的,但是我认为它是从更高层次的API中调用的。 我收到类似的消息gethostbyname 。 为什么不能像所有其他函数一样静态地链接这些函数呢?

为什么从.o创build一个.a文件来进行静态链接?

考虑这个代码: one.c: #include <stdio.h> int one() { printf("one!\n"); return 1; } two.c: #include <stdio.h> int two() { printf("two!\n"); return 2; } prog.c中 #include <stdio.h> int one(); int two(); int main(int argc, char *argv[]) { one(); two(); return 0; } 我想将这些程序链接在一起。 所以我这样做: gcc -c -o one.o one.c gcc -c -o two.o two.c gcc -o a.out prog.c […]

使链接时,gcc偏好静态库共享对象?

当使用-l选项(比如说-lfoo )链接到库时,如果两者都find了(比较喜欢libfoo.so到libfoo.a ),gcc会select共享对象到静态库。 有没有办法让gcc更喜欢静态库,如果两者都find了? 我试图解决的问题如下:我创build一个应用程序(飞行模拟器称为X平面)插件,具有以下限制: 即使在64位系统上运行,插件也应该是32位共享对象的forms 运行环境不提供加载不在“正常”位置(例如/usr/lib或/usr/lib32共享对象的简便方法: 不能指望用户设置LD_PRELOAD或LD_LIBRARY_PATH来查找我的插件附带的共享对象 在dynamic加载插件共享对象之前,X-Plane运行环境不会将我的插件目录添加到“LD_LIBRARY_PATH”,这将允许我将所有需要的共享对象与我的插件共享对象 不能指望64位用户安装非平凡的32位共享对象(比如,不包含在ubuntu的ia32-libs包中) 为了解决上面的约束,一个可能的解决scheme是将生成的共享对象与所使用的所有非平凡库的静态32位版本链接起来。 但是,在安装这样的库时,通常会安装静态和dynamic版本,因此gcc将始终链接到共享对象而不是静态库。 当然,移动/删除/删除有问题的共享对象,只是把静态库放在/usr/lib32 ,是一个解决方法,但这不是一个好的方法 注意: 是的,我读了关于如何链接共享对象和库,我并没有试图创造一个“完全静态链接的共享对象” 是的,我试过了-Wl,-static -lfoo -Wl,-Bdynamic,但没有带来预期的结果 是的,我也尝试了-l:libfoo.a ,但是这也没有带来预期的结果

如何在使用gcc进行静态链接时仅包含已使用的符号?

我正在部署一个用gcc编译的小程序,4.3.2-1.1(Debian)。 这个程序将部署在从Debain 5到最新的Fedora,Ubuntu,Slackware,Arch等虚拟机模板上。 该程序依赖于Xen库中的某些符号,这些符号仅在不稳定的树中可用。 因此,通过虚拟机模板上的各个软件包pipe理器来安装Xen的库并不能解决我的问题。 直到我打包我自己版本的这些库,我需要静态链接可执行文件。 gcc 4.3-x,默认情况下只包含静态链接时实际使用的符号,还是有另一个优化标记,我应该传递给链接器? 我知道,静态链接是不好的,我只是作为一个临时的工作。

创build一个静态的Haskell Linux可执行文件

我常常不喜欢两件事情,一起引起我很多烦恼(除了我的孩子)。 我在工作中使用了一个Haskell程序,它使用像text,xml-enumerator,attoparsec-text等库。我可以正常工作在我的Windows机器上,我的Ubuntu虚拟机在工作(32位),我的Ubuntu桌面(再次32位)和运行Ubuntu(64位)的EC2实例。 我们的客户正在运行CentOS 5.3,64位。 我不能为我的生活得到这个可执行文件正常运行。 我试图创build一个静态的可执行文件, ghc –make myprog.hs -optl-static -optl-pthread 但是当我尝试在CentOS服务器上运行该可执行文件时,我收到一条错误消息: openFile: invalid argument (Invalid argument) 我假设这与这里描述的错误有关。 我试过编译32位和64位Ubuntu,尝试静态和共享的构build,没有任何工作(虽然我偶尔会得到segfaults而不是上述错误信息)。 我可以尝试下载CentOS 5.3并为它创build一个虚拟机,但下载需要一段时间,我不确定哪个版本的GHC可以工作(我尝试在服务器上获得GHC 7,但是我跑了到一个libc的问题)。 在这一点上,我提出了一些可能的方法,但是我想尽可能地避免这些方法: 用不同的语言重写(在Java中这样做的想法使我感到不安,虽然它可能是尝试Cal / OpenQuark的好时机)。 也许尝试一个替代编译器,如jhc。 但是我不太确定如何开始在jhc中安装这个程序的所有依赖项。 如果有经验,并且知道文本/ attoparsec / etc在jhc中工作,我很乐意听到。 所有黑客攻击:build立一个Windows可执行文件,在他们的服务器上安装wine并以这种方式运行。 总而言之,在这些情况下,我真的希望我们有一个用于GHC的JVM后端。 我想我也可以试用LambdaVM。 但我很想听听社区的build议,在这里做什么。

我需要静态库来静态链接吗?

在'C'上,Linux, 我需要静态库来静态链接,或者我有足够的共享吗? 如果没有,为什么不呢? (不要包含相同的数据?)