共享库C ++ Makefile

时间:2017-05-21 14:13:32

标签: c++ makefile compilation shared-libraries

我需要编译胖二进制文件才能在另一台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)

1 个答案:

答案 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目标文件共享库(而不是使用一个)。请参阅thisthat

您可能希望使用make --trace(或remake -x,使用remake)调试Makefile

如果您想了解链接的实际文件,可以在终端上运行-v -Wl,--verbose,将LINKFLAGS添加到make 'LINKFLAGS=-v -Wl,--verbose'

您可能希望先make clean