Articles of 静态链接

共享库中库函数的select性静态链接

我想创build一个使用第三方静态库函数的共享库。 例如,来自libfoobar.a foo和bar 。 我知道我的主要应用程序也使用foo ,并将导出该符号。 所以我只是想在链接bar保存代码大小,并留下'富'未解决(因为它将由主应用程序提供)。 如果我包含libfoobar.a ,链接器ld将在我的共享库中包含这两个函数。 如果我不包含libfoobar.a ,我的库将无法访问functionbar因为应用程序本身并没有在bar链接。 问题: 有没有办法告诉ld在构build共享库时只parsing某些符号? 把libfoobar.a变成共享库? 从libfoobar.a提取包含functionbar文件并在链接器行上指定该文件? 不要担心,运行时加载器将使用您的应用程序中的bar ,这样共享库中的bar副本将不会被加载?

gdb步骤不按预期工作

我在Linux上debugging静态multithreadingx86-64 C ++应用程序。 我可以在函数上设置断点并停止它们,我可以一步一步遍历函数体。 但是,当我尝试进入另一个函数,gdb不停止在它的开始,似乎它只是继续执行。 当我中断程序执行时,gdb进入中断状态并变得不可用: (gdb) bt Target is executing. (gdb) c Continuing. Cannot execute this command while the selected thread is running. (gdb) 作为一种解决方法,我可以使用stepi几次而不是step , stepi按预期工作。 这可能是什么原因呢? 除了使用stepi还有什么解决办法吗? 我使用gdb 7.6和gcc 4.7.1。

静态链接 – 使用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,默认情况下只包含静态链接时实际使用的符号,还是有另一个优化标记,我应该传递给链接器? 我知道,静态链接是不好的,我只是作为一个临时的工作。