Как создать автономные исполняемые файлы с Makefile при использовании внешних библиотек - PullRequest
0 голосов
/ 13 сентября 2018

У меня есть следующее Makefile, которое компилирует проект, который использует внешние библиотеки (openCV, SDL, jsoncpp) в OSX.

Makefile выглядит следующим образом:

CXX = g++

CXXFLAGS = -std=c++11
INC_PATH = `pkg-config --cflags ../cmake_bin_dir/instDir/lib/pkgconfig/opencv.pc` \
    `pkg-config --cflags ../SDL2-2.0.8/build/lib/pkgconfig/sdl2.pc` \
    `pkg-config --cflags ../jsoncpp/build/pkg-config/jsoncpp.pc`


#LIB_PATH = -L../cmake_bin_dir/lib/ ./gainput/build/lib -L../SDL2-2.0.8/build/ -L../SDL2-2.0.8/build/lib
LIBS =  `pkg-config --libs ../cmake_bin_dir/instDir/lib/pkgconfig/opencv.pc` \
    `pkg-config --libs ../SDL2-2.0.8/build/lib/pkgconfig/sdl2.pc` \
    `pkg-config --libs ../jsoncpp/build/pkg-config/jsoncpp.pc`
SOURCES := $(wildcard *.cpp)
OBJDIR=obj

OBJECTS := $(patsubst %.cpp,$(OBJDIR)/%.o,$(SOURCES))
DEPENDS := $(patsubst %.cpp,$(OBJDIR)/%.d,$(SOURCES))

# ADD MORE WARNINGS!
WARNING := -Wall -Wextra

# .PHONY means these rules get executed even if
# files of those names exist.
.PHONY: all clean

# The first rule is the default, ie. "make",
# "make all" and "make parking" mean the same
all: parking

clean:
    $(RM) $(OBJECTS) $(DEPENDS) parking

# Linking the executable from the object files
parking: $(OBJECTS)
    $(CXX) $(WARNING) $(CXXFLAGS) $(INC_PATH) $^ -o $@ $(LIBS)

-include $(DEPENDS)

$(OBJDIR):
    mkdir -p $(OBJDIR)

$(OBJDIR)/%.o: %.cpp Makefile $(OBJDIR)
    $(CXX) $(WARNING) $(CXXFLAGS) $(INC_PATH) -MMD -MP -c $< -o $@

В основном это создает исполняемый файл. Для запуска исполняемого файла мне нужно запустить из терминала команду export DYLD_LIBRARY_PATH=path/To/librarylib/.

Это означает, что я не могу запустить его на других машинах (с той же ОС, которые сейчас не заинтересованы в кросс-компиляции) без установки или сборки библиотеки. Я попытался использовать флаг static следующим образом:

pkg-config --libs --static ../cmake_bin_dir/instDir/lib/pkgconfig/opencv.pc

для статического связывания библиотеки, поскольку это должно сделать исполняемый файл автономным. Я проверял это, но без export он не работает.

Кроме того, я попытался установить флаг static также для связи с другими библиотеками, но статическое связывание библиотеки SDL приводит к следующей ошибке:

ld: library not found for -l/System/Library/Frameworks/AudioToolbox.framework
clang: error: linker command failed with exit code 1

Моя цель - создать автономный исполняемый файл, который можно запускать на компьютерах с той же ОС: как мне изменить Makefile, чтобы добиться этого?

РЕДАКТИРОВАТЬ: мне нужны статические файлы библиотеки *.a? Если так, как я могу собрать openCV, чтобы оба имели динамические файлы (*.dylib on OSX) and static library files (*. A`)?

...