【问题标题】:Shared libraries C++ Makefile共享库 C++ Makefile
【发布时间】:2017-10-21 05:28:28
【问题描述】:

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

【问题讨论】:

  • 顺便说一句,如果您想要一些 HTTP 服务器库,您可能会发现 libonion(或 Wt....)比 -lmicrohttpd 更易于使用
  • 它已经在工作了,但是我需要将此库编译到我的二进制文件中,以便能够在未安装该库的计算机上执行它
  • 请注意,fat binary 具有特定 含义,这不是您想要的。所以只说二进制(或静态链接的二进制)。
  • 一般来说,如果你不知道怎么做,你就不能用Make来做某事没有 Make。您必须弄清楚如何使用命令行构建二进制文件,然后再担心将技术包装到 makefile 中。

标签: c++ makefile compilation shared-libraries


【解决方案1】:

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

您可能想要构建一个静态链接的可执行文件。然后你应该将-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)

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

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

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

顺便说一句,-shared 链接器选项需要从position-independent code 目标文件中构建一个共享库(而不是使用一个)。请参阅this 和that。

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

如果您想了解链接了哪些实际文件,请将-v -Wl,--verbose 添加到LINKFLAGS 或者通过在您的终端上运行make 'LINKFLAGS=-v -Wl,--verbose'。

您可能想先make clean。

【讨论】:

  • 非常感谢。但现在我有:Makefile:15: *** 缺少分隔符。停止。
  • 如果我理解正确并且我在 /usr/lib/x86_64-linux-gnu/libmicrohttpd.so.10 下有 libmicrohttpd。我应该如何运行 make 命令?
  • 那么你没有那个库的静态形式,你可能需要从源代码重新编译它。你肯定想使用libmicrohttpd.a(不是一些libmicrohttpd.so.10,它是一个共享​​>库,而不是一个静态库)
  • 我在同一路径上也有 libmicrohttpd.a,但我如何告诉编译器使用它?
  • 你试过我最后的LIBS= 和-Bstatic -lmicrohttpd -Bdynamic 行吗
猜你喜欢
  • 2010-10-27
  • 1970-01-01
  • 2015-07-28
  • 1970-01-01
  • 1970-01-01
  • 2013-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多