繁体   English   中英

共享库C ++ Makefile

[英]Shared libraries C++ Makefile

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

您最好利用GNU make的许多内置规则。 运行一次make -p来学习它们。 因此,您应该使用CXX而不是CC并将CC_FLAGS替换为CXXFLAGS

您可能需要构建静态链接的可执行文件。 然后,您应该使用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)

AFAIK,您的Makefile不需要任何其他信息(前提是您使用的是GNU make ,而不是BSD)。 当然,您需要在Makefile中使用适当的TAB字符(因此您需要使用一些能够插入它们的编辑器)。

您可能只想静态链接-lmicrohttpd (并动态链接其他库;但是,您可能还想静态链接C ++标准库,该库取决于编译器,并且在编译器更改时可能会更改;还静态链接C ++库留作练习)。 您可以删除LINKFLAGS行并使用

LIBS= -Bstatic -lmicrohttpd -Bdynamic -lz -lpthread

顺便说一句,需要使用-shared链接器选项从与位置无关的代码目标文件中构建一个共享库(不使用 )。 看到这个那个

您可能要使用make --trace (或remake -x ,使用remake )来调试您的Makefile

如果您想了解链接了哪些实际文件,则可以通过在终端上运行make 'LINKFLAGS=-v -Wl,--verbose'LINKFLAGS添加-v -Wl,--verbose

您可能需要先make clean

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM