c++ - 将可执行文件链接到共享库

标签 c++ linker g++

我有一个基本问题,我无法从中找到解决方案。 假设我构建了一个由以下头文件和源文件组成的共享库 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/

相关文章:

c++ - inFile 应该放在 -o 标志之前还是之后?

c++ - 加载对象 mtl Direct3D 11

C++ - 无法从队列中删除元素

linker - 将嵌入式程序拆分为内存中的多个部分

c++ - __global__ 函数的“内联”以避免多重定义错误

c++ - 如何使用g++编译一个VC项目?

c++ - 在 C++ 中附加两个无符号字符的位运算符

priority_queue模板中的c++编译错误

objective-c - 在Xcode中将库添加到项目-找不到符号

c - 通过相互依赖和外部变量将 CUDA 代码与 C 代码链接起来