gpt4 book ai didi

c++ - 将静态链接库变成动态链接库

转载 作者:行者123 更新时间:2023-11-30 05:42:21 39 4
gpt4 key购买 nike

我知道这个问题已被问过几次,但没有一个解决方案对我有用。我有一个静态链接库,我想将其与 Java 8 之前版本的 JNI 层一起使用。基于我对 "how to link static library into dynamic library in gcc" 的阅读,这似乎是可能的。这是我的命令行:

/usr/bin/g++ -shared -std=c++0x -D__extern_always_inline=inline -Wall -pedantic -O3 -fomit-frame-pointer -fno-strict-aliasing -D_FILE_OFFSET_BITS=64 -DNDEBUG - fPIC -Wl,--whole-archive target/vw_jni.a -o target/vw_jni.lib

这是基于将 JNI 层写入 Vowpal Wabbit图书馆。

此时在构建过程中我通过静态链接静态创建了一个名为target/vw_jni.a的文件

target/vw_jni.a:在函数“_fini”中:
(.fini+0x0): `_fini' 的多重定义
/usr/lib/gcc/x86_64-linux-gnu/4.9/../../../x86_64-linux-gnu/crti.o:(.fini+0x0): 首先在这里定义
目标/vw_jni.a:在函数“data_start”中:
(.data+0x8): `__dso_handle' 的多重定义
/usr/lib/gcc/x86_64-linux-gnu/4.9/crtbeginS.o:(.data.rel.local+0x0): 首先在这里定义
目标/vw_jni.a:在函数“_init”中:
(.init+0x0): `_init' 的多重定义
/usr/lib/gcc/x86_64-linux-gnu/4.9/../../../x86_64-linux-gnu/crti.o:(.init+0x0): 首先在这里定义
/usr/lib/x86_64-linux-gnu/libc_nonshared.a(elf-init.oS):在函数 `__libc_csu_init' 中:
(.text+0x0): `__libc_csu_init' 的多重定义
target/vw_jni.a:(.text+0x1cea20): 首先在这里定义
/usr/lib/x86_64-linux-gnu/libc_nonshared.a(elf-init.oS):在函数 `__libc_csu_fini' 中:
(.text+0x70): `__libc_csu_fini' 的多重定义
target/vw_jni.a:(.text+0x1ceab0): 首先在这里定义
/usr/lib/gcc/x86_64-linux-gnu/4.9/crtendS.o:(.tm_clone_table+0x0): `__TMC_END__' 的多重定义
target/vw_jni.a:(.data+0x2630): 首先在这里定义
/usr/bin/ld: target/vw_jni.a: DSO 中不允许 .preinit_array 部分
/usr/bin/ld: 设置动态部分大小失败:输出中不可表示的部分
collect2:错误:ld 返回了 1 个退出状态

我不确定这意味着什么,当我四处搜索它时,会发现类似 "C program no longer compiles in Ubuntu" 的结果这似乎表明我忘记了 -o 标志,但我知道我没有。

  1. 我想做的事情可行吗?
  2. 我做错了什么?

我在通过 docker pull ubuntu:14.04 获得的 Docker 实例上执行此操作

更新:

我可以使用以下命令行消除一些错误

/usr/bin/g++ -shared -std=c++0x -D__extern_always_inline=inline -Wall -pedantic -O3 -fomit-frame-pointer -fno-strict-aliasing -D_FILE_OFFSET_BITS=64 -DNDEBUG - fPIC -nostdlib -Wl,--whole-archive target/vw_jni.a -o target/vw_jni.lib

这会生成以下输出

/usr/bin/ld:警告:无法创建 .note.gnu.build-id 部分,--build-id 被忽略。
/usr/bin/ld: target/vw_jni.a: DSO 中不允许 .preinit_array 部分
/usr/bin/ld: 设置动态部分大小失败:输出中不可表示的部分
collect2:错误:ld 返回了 1 个退出状态

我认为这可行的原因是通过排除标准库我没有重新定义。不过,我不确定从这里到哪里去。

最佳答案

我认为问题出在您使用的命令行上。标志 --whole-archive--no-whole-archive 适用于命令行上的所有后续参数,其中包括许多标准库和目标文件(例如,-lccrt0.olibc_nonshared.a 等)在后台自动附加。

如果在您打算引入的静态库的文件名后没有直接切换 --no-whole-archive,这也适用 --whole-archive到最后一个参数之后的内置存档,例如,它还会尝试从 libc.alibm.a 等中引入每个对象至少会因“多重定义”错误而失败。尝试在 target/vw_jni.a 之后直接将 --no-whole-archive 开关添加到您的命令行,这样您最终会得到如下内容:

/usr/bin/g++ -shared -std=c++0x   -D__extern_always_inline=inline -Wall -pedantic -O3 \
-fomit-frame-pointer -fno-strict-aliasing -D_FILE_OFFSET_BITS=64 -DNDEBUG -fPIC \
-Wl,--whole-archive target/vw_jni.a -Wl,--no-whole-archive \
-o target/vw_jni.lib

关于c++ - 将静态链接库变成动态链接库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30714513/

39 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com