我正在使用Redhat内置的应用程序,该应用程序包含一个与多个库链接的进程。如果我将所有库构建为共享库,它会正确运行,但如果我将库构建为静态库则不会。它似乎在两种情况下都正确链接(至少没有未定义的引用)。
应用程序和库非常复杂,所以我没有通过代码来搜索问题。我正在为共享版本和静态版本构建完全相同的源代码,因此我无法想象它是代码问题。
对这类问题有什么可能的解释?我已经包含了我用于源代码的构建命令,以及每种情况下的库
用于创建共享对象的命令:
g++ -fPIC -shared -Wl,-as-needed -m64 -Wl,soname,.. -o ... -LANG:std -Wl,--warn-once <object files>
用于创建静态库的命令:
ar cr <libname> <object files>
用于构建源文件的命令(在两种情况下):
g++ -fPIC -m64 -c -Werror -Wno-deprecated -g
请注意,我计划将其移植到不支持共享库的其他平台,因此需要让应用程序使用静态库。我希望以前有人见过这个问题,并就如何继续提出一些建议。如果没有,我的下一个选择是开始调试代码以比较应用程序在两种情况下的执行方式。
我唯一能想到的就是这会导致我的静态库的链接顺序不正确 - 并且链接器正在从其中一个库中提取错误的函数。但如果是这种情况,我认为某处会出现“多重定义”错误。