【发布时间】:2021-08-03 16:01:34
【问题描述】:
我正在尝试使用较新版本的 gcc/ld 构建项目。
makefile 的相关部分(实际名称已编辑)是:
THEIRDIR = third-party/theircomponent/$(THEIRRELEASE)/$(PLATFORM)
THEIRLIBS = $(top_srcdir)/$(THEIRDIR)/lib/theirlib.a
BLDLIBS = $(THEIRLIBS) $(OTHERLIBS)
SRCFILES = thing.cpp main.cpp
OBJS = $(SRCFILES:.cpp=.o)
TARGET = thing
$(TARGET): $(OBJS)
$(CXX) $(CXXFLAGS) $(LIBPATHS) -o $@ $^ $(BLDLIBS)
其中 THEIRRELEASE 和 PLATFORM 在外部包含的 makefile 中设置,而 LIBPATHS 未在任何地方设置。
theirlib.a 实际上不是库,而是一个包含 theirlib.a.1.2.3.4(无换行符)的文本文件,其中 theirlib.a.1.2.3.4 是实际库,与 theirlib.a 位于同一目录中。
这适用于构建机器,它有
- gcc 版本 4.8.5 20150623 (Red Hat 4.8.5-39) (GCC)
- GNU ld 版本 2.27-43.base.el7_8.1
不幸的是,当我尝试在不同的盒子上构建它时:
- gcc 版本 9.3.0 (Ubuntu 9.3.0-17ubuntu1~20.04)
- GNU ld(适用于 Ubuntu 的 GNU Binutils)2.34
失败并出现错误:
/usr/bin/ld:/work/product/third-party/theircomponent/1.2.3.4/x86_64-redhat-linux.el7/lib/theirlib.a: file format not recognized; treating as linker script
/usr/bin/ld:/work/product/third-party/theircomponent/1.2.3.4/x86_64-redhat-linux.el7/lib/theirlib.a:0: syntax error
我认为“视为链接器脚本”是使旧工具发生奇迹的理想行为(即使在这种情况下它没有发出任何诊断信息),但它不适用于较新的工具。
我无法控制“他们的”组件,但我可以修改“我们的”makefile,尽管它应该保持向后兼容。
我尝试用@$(top_srcdir)/$(THEIRDIR)/lib/theirlib.a 替换$(top_srcdir)/$(THEIRDIR)/lib/theirlib.a(这不是最好的解决方案,因为它们的lib.a 有时可能会更改为实际的库)。这摆脱了语法错误,但导致
g++: error: theirlib.a.1.2.3.4: No such file or directory
我也尝试指定-L /work/product/third-party/theircomponent/1.2.3.4/x86_64-redhat-linux.el7/lib(使用-Wl, 和直接指定)但没有帮助。
有没有办法让它像使用旧工具一样工作,理想情况下只需将未使用的LIBPATHS 变量设置为一些标志?
【问题讨论】:
-
Ubuntu 20.04:您可以使用 Ubuntu 18.04 存储库中的 gcc-4.8 / g++-4.8。 ..... 或来自drive.google.com/drive/folders/… 的 gcc48-c++_4.8.4-2ubuntu14_amd64.deb ....... 注意:许多旧软件需要旧版 gcc。