У меня есть следующее 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`)?