我认为它不起作用,但我只是将我的程序文件从本地计算机上传到Amazon 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
答案 0 :(得分:2)
一个丑陋但简单的解决方案可能是静态链接您的程序。
更精细的解决方案可能是模仿EC2实例的环境。本地计算机上的chroot
环境。
在两者之间,您可以在本地复制EC2的/ usr / include和/usr/lib/libc.so ...等..但这样做有风险。
也许你也可以在本地编译,并在EC2上链接......(但这可能不起作用)
答案 1 :(得分:1)
可以构建动态库lib*.so
,并依赖于其他动态库。 (例如,在您计算机上的其他系统ldd /usr/lib/libgtk-3.so
库中尝试ldd
或*.so
。
静态库lib*.a
本质上只是*.o
个目标文件的混合,并且不知道它的依赖关系。
因此,当静态链接时,您确实需要以正确的顺序链接所有库。