C++ 共享库C++;生成文件

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

我需要编译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 -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)
如果您使用的是GNU
make
,而不是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=