gpt4 book ai didi

c++ - 共享库 C++ Makefile

转载 作者:搜寻专家 更新时间:2023-10-31 01:32:04 26 4
gpt4 key购买 nike

我需要编译 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

您可能想要构建一个静态链接的可执行文件。然后,您应该使用 LINKFLAGS

-static 传递到您的 linking 命令中

所以试试

## 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 字符(因此您需要使用一些能够插入它们的编辑器)。

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

来做到这一点
LIBS= -Bstatic -lmicrohttpd -Bdynamic -lz -lpthread

顺便说一句,-shared 链接器选项需要从 position-independent code构建对象文件共享库(不是使用一个)。参见 thisthat .

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

如果您想了解链接的实际文件是什么,请将 -v -Wl,--verbose 添加到 LINKFLAGS 中,也许可以通过运行 make 'LINKFLAGS=- v -Wl,--verbose' 在您的终端上。

您可能想先清理

关于c++ - 共享库 C++ Makefile,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44097902/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com