如何从Arch Linux构建基本64位Amazon Linux

How do you build for Basic 64-bit Amazon Linux from Arch Linux?

本文关键字:Linux 64位 Amazon 构建 Arch      更新时间:2023-10-16

我认为它不会工作,但我刚刚将我的程序文件从本地机器上传到亚马逊EC2上的新实例。然后试着运行它:

[ec2-user@domU-12-31-39-14-2A-1A ~]$ ./webserver.net
-bash: ./webserver.net: /lib/ld-linux-x86-64.so.2: bad ELF interpreter: No such file or directory

显然没有/lib/ld-linux-x86-64.so.2。64位实例。

我如何在本地机器上编译/链接EC2实例。我不想在实例上构建它。

我的Makefile

OBJECTS= ./obj/hello.o
LDFLAGS = -L/usr/lib -lwt -lwthttp
./bin/webserver.net : $(OBJECTS)
    g++ -o ./bin/webserver.net $(OBJECTS) $(LDFLAGS)
./obj/hello.o : ./src/hello.cpp 
    g++ -c ./src/hello.cpp -o ./obj/hello.o 
.PHONY: clean
clean:
    -rm -f obj/*.o bin/webserver.net core *~ src/*~ 

更新静态链接文件。在我以正确的顺序手动添加每个库之前,存在未定义的引用。这有必要吗?还是我做错了?

g++ -static -pthread -o ./bin/out.net ./obj/hello.o -lwthttp -lwt  -lboost_thread -lboost_system -lboost_program_options -lboost_random -lboost_signals -lboost_filesystem -lboost_regex -lboost_serialization -lboost_date_time -lssl -lcrypto -lz -ldl 

一个丑陋但简单的解决方案可能是静态链接您的程序。

一个更精细的解决方案可能是在本地机器上模拟EC2实例的环境,例如chroot -ed环境。

你可以复制EC2的/usr/include和/usr/lib/lib .so…等。局部的,但那是有风险的。

也许你也可以在本地编译,并在EC2上链接…(但这可能行不通)

动态库lib*.so可以与其他动态库的依赖关系构建。(例如,在您机器上的其他系统*.so库上尝试ldd /usr/lib/libgtk-3.soldd)。

静态库lib*.a本质上只是*.o对象文件的混合,并且不知道它的依赖关系。

因此,当静态链接时,您确实需要以正确的顺序链接所有库。