Solaris ld:致命:无法识别的选项' - '

时间:2015-07-20 17:17:11

标签: gcc linker cmake solaris ld

我正在尝试在Solaris计算机上编译Apache Qpid,但在链接期间它会崩溃:

operator ++

-E选项调用的命令文件是CMakeFiles / qpidtypes.dir / link.txt,它包含:

Scanning dependencies of target qpidtypes
[  0%] Building CXX object src/CMakeFiles/qpidtypes.dir/qpid/types/Exception.cpp.o
[  0%] Building CXX object src/CMakeFiles/qpidtypes.dir/qpid/types/Uuid.cpp.o
[  0%] Building CXX object src/CMakeFiles/qpidtypes.dir/qpid/types/Variant.cpp.o
Linking CXX shared library libqpidtypes.so
ld: fatal: unrecognized option '--'
ld: fatal: use the -z help option for usage information
*** Error code 1
The following command caused the error:
cd /export/home/user/qpid-cpp-0.34/build/src && /opt/csw/bin/cmake -E cmake_link_script CMakeFiles/qpidtypes.dir/link.txt --verbose=
make: Fatal error: Command failed for target `src/libqpidtypes.so.1.0.0'
Current working directory /export/home/user/qpid-cpp-0.34/build
*** Error code 1

问题似乎是-Wl, - version-script = / export / home / user / qpid-cpp-0.34 / src / qpid.linkmap

This question使用两个破折号的选项,但我不知道如何做到这一点。

问题:如何让ld接受--version-script信息?

有关ld版本的一些信息:

/usr/bin/gcc  -fPIC -fno-visibility-inlines-hidden -fvisibility=hidden -Wl,--version-script=/export/home/user/qpid-cpp-0.34/src/qpid.linkmap  -m64  -pthread -shared  -Wl,-hlibqpidtypes.so.1 -o libqpidtypes.so.1.0.0 CMakeFiles/qpidtypes.dir/qpid/types/Exception.cpp.o CMakeFiles/qpidtypes.dir/qpid/types/Uuid.cpp.o CMakeFiles/qpidtypes.dir/qpid/types/Variant.cpp.o  -L/usr/local/lib  -L/usr/lib/mps -luuid -Wl,-R/usr/local/lib:/usr/lib/mps: 

关于gcc版本的一些信息:

$ gcc -print-prog-name=ld
/usr/ccs/bin/ld

$ /usr/ccs/bin/ld -V
ld: Software Generation Utilities - Solaris Link Editors: 5.10-1.1514

2 个答案:

答案 0 :(得分:1)

在solaris 10上构建openldap版本2.4.39时,我有相同的错误消息。

solaris提供的链接器不支持确实如前一个回答中所述的双破折号“-”。但是您必须找到与两个破折号一起使用的option参数,而错误消息中未明确提及。

要找到相应的选项,必须查看控制台中显示的链接命令,并查看配置文件或定义了它的项目配置文件中的内容。

特别是对于openldap,我使用了库中交付的配置文件。但是问题是链接器选项rpath与两个破折号一起使用来设置以下变量,如下所示:

  • hardcode_libdir_flag_spec ='$ {wl} - rpath $ {wl} $ libdir'

通过删除多余的破折号,已在某些aclocal.m4文件(在不同文件夹中)和libtool脚本中解决了该问题。

该库也是在Linux上构建的,无需修改任何其他文件。

答案 1 :(得分:0)

问题是Solaris链接器无法识别以两个短划线开头的许多选项。

Solaris ld: fatal: unrecognized option '--'

可以使用

解决
ld -z help

并找到正确的替代品。

在我的特定情况下,我发现了solution in the qpid mailing list,根本不使用--version-script:

  

在SunOs上(至少在我的机器上)这不起作用:

     

/ usr / bin / gcc -fPIC -fno-visibility-inlines-hidden -fvisibility = hidden

     

轮候册, - 版本脚本= /导出/家庭/ NONAME /安装/ qpid-0.28_tmptest / CPP / src目录/ qpid.linkmap

     

-shared -Wl,-hlibqpidtypes.so.1 -o libqpidtypes.so.1.0.0 CMakeFiles / qpidtypes.dir / qpid / types / Exception.cpp.o   CMakeFiles / qpidtypes.dir / qpid /类型/ Uuid.cpp.o   CMakeFiles / qpidtypes.dir / qpid / types / Variant.cpp.o -L / usr / local / lib   -L / usr / lib / mps -luuid -Wl,-R / usr / local / lib:/ usr / lib / mps

     

问题是:
  “轮候册, - 版本脚本= /导出/家庭/ NONAME /安装/ qpid-0.28_tmptest / CPP / src目录/ qpid.linkmap”

     

因此需要将以下内容插入cpp / src / CMakeLists.txt:

     

184 if(GCC_VERSION VERSION_EQUAL 4.1.2)185消息   (状态“无法限制gcc上的库符号导出   4.1.2“)186集(HIDE_SYMBOL_FLAGS”-fno-visibility-inlines-hidden“)187 else(GCC_VERSION   VERSION_EQUAL 4.1.2)188集(HIDE_SYMBOL_FLAGS   “-fno能见度 - 内联隐藏   -fvisibility = hidden“)189集(QPID_LINKMAP $ {CMAKE_CURRENT_SOURCE_DIR} /qpid.linkmap)190 191#   ---------------------如果(NOT CMAKE_SYSTEM_NAME STREQUAL SunOS)193需要为Solaris 192插入以下三行   set(LINK_VERSION_SCRIPT_FLAG“-Wl, - version-script = $ {QPID_LINKMAP}”)   194 endif(NOT CMAKE_SYSTEM_NAME STREQUAL SunOS)195 196
  endif(GCC_VERSION VERSION_EQUAL 4.1.2)