共享库 C++ Makefile
Shared libraries C++ Makefile
我需要编译 fat 二进制文件才能在另一台 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)
您最好利用 GNU make 的许多内置规则。 运行一次make -p
学习它们。所以你应该使用 CXX
而不是 CC
并将 CC_FLAGS
替换为 CXXFLAGS
.
您可能想要构建静态 linked 可执行文件。然后你应该将 -static
传递到你的 linking 命令中,使用 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)
据我所知,您的 Makefile
中不再需要任何东西(前提是您使用 GNU make
,而不是 BSD 等)。当然,您的 Makefile
中需要适当的 TAB 字符(因此您需要使用一些能够插入它们的编辑器)。
您可能只想静态 link -lmicrohttpd
(动态 link 其他库;但是,您可能还想静态 link C++ 标准库,这取决于编译器,并且可能会随着编译器的变化而变化;link静态地访问 C++ 库作为练习)。您可以通过删除 LINKFLAGS
行并使用
来做到这一点
LIBS= -Bstatic -lmicrohttpd -Bdynamic -lz -lpthread
顺便说一句,-shared
linker 选项需要从 position-independent code object files a shared library (not to use one). See this and that.
build
您可能想使用 make --trace
(或 remake -x
,使用 remake)调试您的 Makefile
如果您想了解 link 编辑了哪些实际文件,请在您的终端上通过 运行 make 'LINKFLAGS=-v -Wl,--verbose'
将 -v -Wl,--verbose
添加到 LINKFLAGS
。
你可能想先 make clean
。
我需要编译 fat 二进制文件才能在另一台 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)
您最好利用 GNU make 的许多内置规则。 运行一次make -p
学习它们。所以你应该使用 CXX
而不是 CC
并将 CC_FLAGS
替换为 CXXFLAGS
.
您可能想要构建静态 linked 可执行文件。然后你应该将 -static
传递到你的 linking 命令中,使用 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)
据我所知,您的 Makefile
中不再需要任何东西(前提是您使用 GNU make
,而不是 BSD 等)。当然,您的 Makefile
中需要适当的 TAB 字符(因此您需要使用一些能够插入它们的编辑器)。
您可能只想静态 link -lmicrohttpd
(动态 link 其他库;但是,您可能还想静态 link C++ 标准库,这取决于编译器,并且可能会随着编译器的变化而变化;link静态地访问 C++ 库作为练习)。您可以通过删除 LINKFLAGS
行并使用
LIBS= -Bstatic -lmicrohttpd -Bdynamic -lz -lpthread
顺便说一句,-shared
linker 选项需要从 position-independent code object files a shared library (not to use one). See this and that.
您可能想使用 make --trace
(或 remake -x
,使用 remake)调试您的 Makefile
如果您想了解 link 编辑了哪些实际文件,请在您的终端上通过 运行 make 'LINKFLAGS=-v -Wl,--verbose'
将 -v -Wl,--verbose
添加到 LINKFLAGS
。
你可能想先 make clean
。