【发布时间】:2015-06-08 16:30:27
【问题描述】:
我知道这个问题已被问过几次,但没有一个解决方案对我有用。我有一个静态链接库,我想将它与 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: In function `_fini':
(.fini+0x0): multiple definition of `_fini'
/usr/lib/gcc/x86_64-linux-gnu/4.9/../../../x86_64-linux-gnu/crti.o:(.fini+0x0): first defined here
target/vw_jni.a: In function `data_start':
(.data+0x8): multiple definition of `__dso_handle'
/usr/lib/gcc/x86_64-linux-gnu/4.9/crtbeginS.o:(.data.rel.local+0x0): first defined here
target/vw_jni.a: In function `_init':
(.init+0x0): multiple definition of `_init'
/usr/lib/gcc/x86_64-linux-gnu/4.9/../../../x86_64-linux-gnu/crti.o:(.init+0x0): first defined here
/usr/lib/x86_64-linux-gnu/libc_nonshared.a(elf-init.oS): In function `__libc_csu_init':
(.text+0x0): multiple definition of `__libc_csu_init'
target/vw_jni.a:(.text+0x1cea20): first defined here
/usr/lib/x86_64-linux-gnu/libc_nonshared.a(elf-init.oS): In function `__libc_csu_fini':
(.text+0x70): multiple definition of `__libc_csu_fini'
target/vw_jni.a:(.text+0x1ceab0): first defined here
/usr/lib/gcc/x86_64-linux-gnu/4.9/crtendS.o:(.tm_clone_table+0x0): multiple definition of `__TMC_END__'
target/vw_jni.a:(.data+0x2630): first defined here
/usr/bin/ld: target/vw_jni.a: .preinit_array section is not allowed in DSO
/usr/bin/ld: failed to set dynamic section sizes: Nonrepresentable section on output
collect2: error: ld returned 1 exit status
我不确定这意味着什么,当我四处搜索时,发现诸如 "C program no longer compiles in Ubuntu" 这样的结果似乎表明我忘记了 -o 标志,但我知道我没有。
- 我正在尝试做的事情可能吗?
- 我做错了什么?
我在通过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: warning: Cannot create .note.gnu.build-id section, --build-id ignored.
/usr/bin/ld: target/vw_jni.a: .preinit_array section is not allowed in DSO
/usr/bin/ld: failed to set dynamic section sizes: Nonrepresentable section on output
collect2: error: ld returned 1 exit status
我认为这可行的原因是通过排除标准库我没有重新定义。不过我不确定从这里去哪里。
【问题讨论】:
-
如果不出意外,您可以将库的所有成员提取到一个空目录中,并将它们链接到一个动态库中(假设所有成员都是 .o 文件,至少)。
-
我想我可以。理想情况下,我想将此库打包在 Maven 工件中,因此我必须将所有这些都打包。
-
你知道静态库中的每个对象都是用
-fPIC编译的吗? -
我知道所有的大众代码都是。这还包括以下链接器选项
-l boost_program_options -l pthread -l z
标签: c++ gcc linker static-linking dynamic-linking