我正在尝试在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
答案 0 :(得分:1)
在solaris 10上构建openldap版本2.4.39时,我有相同的错误消息。
solaris提供的链接器不支持确实如前一个回答中所述的双破折号“-”。但是您必须找到与两个破折号一起使用的option参数,而错误消息中未明确提及。
要找到相应的选项,必须查看控制台中显示的链接命令,并查看配置文件或定义了它的项目配置文件中的内容。
特别是对于openldap,我使用了库中交付的配置文件。但是问题是链接器选项rpath与两个破折号一起使用来设置以下变量,如下所示:
通过删除多余的破折号,已在某些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)