【发布时间】:2019-01-18 07:02:14
【问题描述】:
我正在尝试按照here 给出的答案将多个静态库合并到 MinGW64 下的单个存档中。具体来说,我使用 CMake 并指定以下命令:
add_custom_command(
OUTPUT ${COMBINED_CORE_LIB_NAME}
COMMAND ${AR} -crs ${COMBINED_CORE_LIB_NAME} ${CORE_LIB_TARGET_FILES}
DEPENDS ${DILIGENT_CORE_INSTALL_LIBS_LIST}
COMMENT "Combining core libraries..."
)
另外,根据here的推荐,我不使用stock ar,而是cross ar:
find_program(AR NAMES x86_64-w64-mingw32-gcc-ar)
但是,无论我做什么,ar 都拒绝生成索引,并且每次我尝试链接生成的库时,都会收到此错误:
error adding symbols: Archive has no index; run ranlib to add one
按照 stock one 或 x86_64-w64-mingw32-gcc-ranlib 的建议运行 ranlib 没有区别。
我花了 15 分钟来使用 MSVC 和 lib.exe 完成这项工作,并且已经在 MinGW 上苦苦挣扎了 8 个小时。任何建议将不胜感激。
[编辑]:事实证明,这个问题并不是 MinGW 所特有的,而且在 Linux 上也以非常相似的方式发生。
【问题讨论】:
-
合并档案后,您必须运行
ranlib来创建索引。您应该在自定义命令中有另一个步骤,例如COMMAND ${RANLIB} ${COMBINED_CORE_LIB_NAME}。 (我遇到过similar problem on Android)。 -
正如我在问题中提到的,运行 ranlib 无论是 stock one 还是 x86_64-w64-mingw32-gcc-ranlib 都没有区别。还有 s 选项应该使 ar 生成索引。
-
好吧,我通常使用
ranlib作为单独的步骤。也许您需要构建存档COMMAND ${AR} cr ${COMBINED_CORE_LIB_NAME},然后使用COMMAND ${AR} s ${COMBINED_CORE_LIB_NAME}作为单独的步骤构建索引。 -
MinGW 声音坏了。提交错误报告并要求解决。 (我像瘟疫一样避免 MinGW。这不过是问题)。
-
@jww 不能再同意了,但出于某种原因,我图书馆的很多用户更喜欢 MinGW,所以我正在努力支持它。
标签: c++ c cmake static-libraries unix-ar