我有一个基本问题,我无法从中找到解决方案。
假设我构建了一个由以下头文件和源文件组成的共享库 toto
:
托托.h
void print();
toto.cpp
#include <iostream>
#include "toto.h"
void print()
{
std::cout<<"WHAT A GREAT LIBRARY"<<std::endl;
}
基于这些文件我创建了我的共享库
g++ -fPIC -shared -I。 -c toto.cpp -o libtoto.so
接下来,我想在测试文件中使用我新创建的共享库:
测试.cpp
#include "toto.h"
int main()
{
print();
}
为此,我使用
将我的可执行文件链接到共享库g++ -I。 -L。 -ltoto test.cpp
我得到了我的 a.out
可执行文件。
当我执行 ldd a.out
时,我得到以下输出:
linux-vdso.so.1 => (0x00007fff322f5000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fb7e7c24000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fb7e7865000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fb7e7568000)
/lib64/ld-linux-x86-64.so.2 (0x00007fb7e7f4d000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fb7e7352000)
我没有看到我的可执行文件对 toto
共享库有任何依赖性。在链接过程中,一切似乎都已静态绑定(bind)到我的可执行文件。我可以从任何地方调用 a.out
而无需将 LD_LIBRARY_PATH
设置为存储我的 libtoto.so
的路径这一事实似乎证实了这一点。事实真的如此吗?如果是这样,我在上述命令中遗漏或误解了什么才能达到这一点?
仅供引用,此示例在 ubuntu 12.04、g++ 4.6.3 上运行
编辑:
同时我发现这段代码产生了一个“正确的”
ldd
显示对 libtoto
共享库的依赖,并且在不设置 LD_LIBRARY_PATH
变量的情况下无法启动可执行文件:
g++ -I ./mydylib/ -fpic -c mydylib/toto.cpp -o mydylib/toto.o
g++ -shared -o mydylib/libtoto.so mydylib/toto.o
g++ -I ./mydylib/ -L ./mydylib/ test.cpp -ltoto -o ldd_correct
虽然这仍然会生成具有上述功能的“错误”可执行文件:
g++ -I ./mydylib -fpic -shared -c mydylib/toto.cpp -o mydylib/libtoto.so
g++ -I ./mydylib -L ./mydylib test.cpp -ltoto -o ldd_wrong
最佳答案
我的猜测是因为它是一个如此简单的库,所以被优化掉了。更复杂的库还会发生这种情况吗?您是否尝试过传递 -O0
标志?
我试过了,但无法重现结果 - 我的 ldd
显示
linux-vdso.so.1 => (0x00007fffb79fe000)
libtoto.so (0x00007f8a78316000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f8a77f2e000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f8a77c2a000)
/lib64/ld-linux-x86-64.so.2 (0x00007f8a7851a000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f8a77924000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f8a7770d000)
在 Ubuntu 14.04 gcc 版本 4.8.2 上
然而,如我所料,g++ -I。 -L。 -ltoto test.cpp
无效 - 我必须运行 g++ -I。 -L。 test.cpp -ltoto
代替。
关于c++ - 将可执行文件链接到共享库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28540225/