C++ 共享库C++;生成文件
我需要编译fat二进制文件,以便能够在另一台linux机器上使用它。但是缺少了一些库,所以据我所知,我应该使用一些共享选项来编译它。但我不明白如何为此配置Makefile。当前我的makefile如下所示:C++ 共享库C++;生成文件,c++,makefile,compilation,shared-libraries,C++,Makefile,Compilation,Shared Libraries,我需要编译fat二进制文件,以便能够在另一台linux机器上使用它。但是缺少了一些库,所以据我所知,我应该使用一些共享选项来编译它。但我不明白如何为此配置Makefile。当前我的makefile如下所示: CC = g++ CC_FLAGS = -std=c++11 -O2 -static -Wall EXEC = cpp_server SOURCES = $(wildcard *.cpp) OBJECTS = $(SOURCES:.cpp=.o) LIBS = -lpthread -lmi
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)
CC=g++
CC_标志=-std=c++11-O2-静态-墙壁
EXEC=cpp\u服务器
源=$(通配符*.cpp)
对象=$(源:.cpp=.o)
LIBS=-lpthread-lmmicrohttpd-lz
$(执行):$(对象)
$(CC)$(对象)-o$(EXEC)$(LIBS)
%.o:%.cpp
$(CC)-c$(CC_标志)$<-o$@
清洁:
rm-f$(执行)$(对象)
您最好利用GNU make的许多内置规则。运行一次make-p
,学习它们。因此,您应该使用CXX
而不是CC
,并用cxflags
替换CC\u标志
您可能希望构建一个静态链接的可执行文件。然后您应该使用LINKFLAGS
将-static
传递到您的链接命令中
所以试试看
## 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)
如果您使用的是GNUmake
,而不是BSD,那么您的Makefile
中就不需要更多内容了。当然,您需要在Makefile
中使用适当的制表符(因此您需要使用能够插入它们的编辑器)
<> >你可以只想静态链接<代码> -LMyTwittP< <代码>(动态链接其他库),但是,你可能还想静态地连接C++标准库,这取决于编译器,当编译器发生变化时,它可以改变;静态链接C++库也可以作为一个练习。您可以通过删除LINKFLAGS
行并使用
LIBS= -Bstatic -lmicrohttpd -Bdynamic -lz -lpthread
顺便说一句,-shared
链接器选项需要从对象文件构建一个共享库(而不是使用一个)。见和
您可能希望使用make--trace
(或remake-x
,使用)调试Makefile
如果您想了解链接的实际文件是什么,可以通过在终端上运行make'LINKFLAGS=-v-Wl,--verbose'
将-verbose
添加到LINKFLAGS
你可能想在做任何事情之前清理一下。顺便说一句,如果你想要一些HTTP服务器库,你可能会发现(或…)比-lmicrohttpd
更容易使用,但是我需要将这个库编译成二进制文件,以便在没有安装该库的计算机上执行。注意,它有一个特定的含义,这不是您想要的。说到二进制文件(或静态链接的二进制文件),一般来说,如果你不知道如何在没有Make的情况下使用Make,那么你就不能使用Make。在您担心将该技术包装到makefile中之前,您必须弄清楚如何使用命令行构建二进制文件。非常感谢。但现在我有:Makefile:15:**缺少分隔符。停止。如果我理解正确并且在/usr/lib/x86_64-linux-gnu/libmicrohttpd.so.10下有libmicrohttpd。我应该如何运行make命令?那么您没有该库的静态形式,您可能需要从源代码处重新编译它。您肯定想使用libmicrohttpd.a
(不是一些libmicrohttpd.so.10
,它是一个共享库,不是静态库)我也有libmicrohttpd.a在同一条路径上,但我如何告诉编译器使用它呢?您是否用-Bstatic-lmmicrohttpd-Bdynamic>尝试了我的上一行LIBS=