我需要为32位平台编译我的c ++应用程序。为了支持旧系统,我已经静态链接了libstdc ++。麻烦的是,即使使用静态libstdc ++ gcc链接器也会添加很多动态符号。
以下是已编译应用程序的nm -D
输出:
08137f2c u _ZNSt7num_putIcSt19ostreambuf_iteratorIcSt11char_traitsIcEEE2idE
08137fbc u _ZNSt7num_putIwSt19ostreambuf_iteratorIwSt11char_traitsIwEEE2idE
08135b24 V _ZTINSt8ios_base7failureE
08135930 V _ZTISt10bad_typeid
08134e90 V _ZTISt10moneypunctIcLb0EE
08134e70 V _ZTISt10moneypunctIcLb1EE
081354b0 V _ZTISt10moneypunctIwLb0EE
08135490 V _ZTISt10moneypunctIwLb1EE
08135b44 V _ZTISt11logic_error
08135b8c V _ZTISt11range_error
0813380c V _ZTISt11regex_error
还有很多其他的符号。它们大多是独特的全球或弱物。下面是Makefile和一个简单的cpp文件。
的main.cpp
#include <iostream>
int main()
{
std::cout << "s" << std::endl;
return 0;
}
生成文件
CXX = g++
EXE = app
CXXFLAGS = -std=c++14 -m32
LDFLAGS = -m32
LDLIBS = -static-libstdc++ -static-libgcc
SOURCES = main.cpp
OBJS = $(subst .cpp,.o,$(SOURCES))
all: $(EXE)
strip $(EXE)
$(EXE): $(OBJS)
$(CXX) $(LDFLAGS) -o $@ $(OBJS) $(LDLIBS)
%.o: %.cpp
$(CXX) $(CXXFLAGS) -c $<
clean:
rm -rf $(OBJS) $(EXE)
有什么方法可以摆脱这些符号吗? 我使用的libstdc ++来自Arch linux上的最后一个gcc(6.2.1)。 x64版本编译时没有任何其他符号。