我需要编译胖二进制文件才能在另一台Linux机器上使用它。但是有一些库缺失,所以我知道我应该用一些-shared选项编译它。但我不明白如何配置Makefile。目前我的makefile看起来像这样:
CC = g++
CC_FLAGS = -std=c++11 -O2 -static -Wall
EXEC = cpp_server
SOURCES = $(wildcard *.cpp)
OBJECTS = $(SOURCES:.cpp=.o)
LIBS = -lpthread -lmicrohttpd -lz
$(EXEC): $(OBJECTS)
$(CC) $(OBJECTS) -o $(EXEC) $(LIBS)
%.o: %.cpp
$(CC) -c $(CC_FLAGS) $< -o $@
clean:
rm -f $(EXEC) $(OBJECTS)
答案 0 :(得分:3)
您最好利用GNU make的许多内置规则。运行一次make -p
以了解它们。因此,您应该使用CXX
代替CC
,并将CC_FLAGS
替换为CXXFLAGS
。
您可能希望构建静态链接的可执行文件。然后,您应该使用-static
LINKFLAGS
传递到链接命令
请尝试使用
## untested Makefile for GNU make
# variables known to make
CXX= g++
CXXFLAGS= -std=c++11 -O2 -Wall -Wextra
LINKFLAGS= -static
LIBS= -lpthread -lmicrohttpd -lz
# this project needs:
MYEXEC= cpp_server
MYSOURCES= $(wildcard *.cpp)
MYOBJECTS= $(SOURCES:.cpp=.o)
.PHONY: all clean
all: $(MYEXEC)
$(MYEXEC): $(MYOBJECTS)
$(LINK.cc) $^ $(LOADLIBES) $(LDLIBS) -o $@
clean:
rm -f $(MYEXEC) $(MYOBJECTS)
AFAIK您不需要Makefile
中的任何内容(假设您使用的是GNU make
,而不是像BSD那样)。当然,在Makefile
中需要适当的 TAB 字符(所以你需要使用一些能够插入它们的编辑器)。
您可能希望仅静态链接-lmicrohttpd
(并动态链接其他库;但是,您可能还希望静态链接C ++标准库,这取决于编译器,并且可能在编译器更改时更改;静态链接C ++库仍然是一个练习)。您可以删除LINKFLAGS
行并使用
LIBS= -Bstatic -lmicrohttpd -Bdynamic -lz -lpthread
BTW -shared
链接器选项需要构建来自position-independent code目标文件共享库(而不是使用一个)。请参阅this和that。
您可能希望使用make --trace
(或remake -x
,使用remake)调试Makefile
如果您想了解链接的实际文件,可以在终端上运行-v -Wl,--verbose
,将LINKFLAGS
添加到make 'LINKFLAGS=-v -Wl,--verbose'
。
您可能希望先make clean
。