написание make-файла Cygwin для Ubuntu - PullRequest
1 голос
/ 25 июня 2011

Я пытаюсь скомпилировать AAM-библиотеку с открытым исходным кодом.Я пробовал в Visual Studio, и хотя он скомпилирован, он имел ошибку во время выполнения.Сейчас я пытаюсь скомпилировать его в Ubuntu 11.04, используя G ++.Единственный предоставленный make-файл - это make-файл cygwin.Я пытаюсь использовать это для компиляции в Ubuntu.(Я включил make-файл ниже).У меня проблема в нижних строках:

libaamlibrary.dll.a: $(OBJS)
        g++ -fPIC -shared $(OBJS) $(LIBS) -o cygaamlibrary-2.dll -Wl,--enable-auto-image-base -Xlinker --out-implib -Xlinker libaamlibrary.dll.a

"- enable-auto-image-base" не распознается.Я пытаюсь переписать эти 3 строки в форму, которая делает то же самое, но работает в Ubuntu, но я изо всех сил, потому что я действительно не понимаю, что делают строки (например, я не понимаю Xlinker и как ондолжен быть использован).Любой совет будет высоко ценится ... Вот полный makefile для справки:

CPPFLAGS = -I. -I/home/andrew/MscProject/OpenCV-2.3.0/include/opencv -O2 -Wall -g -MD -fPIC
PROGRAMS = libaamlibrary.dll.a  libaamlibrary.a fit build 
LIBS = -L/usr/local/lib -lopencv_core -lopencv_imgproc -lopencv_highgui -lopencv_ml -lopencv_video -lopencv_features2d -lopencv_calib3d -lopencv_objdetect -lopencv_contrib -lopencv_legacy -lopencv_flann  
OBJS = AAM_Util.o VJfacedetect.o AAM_Shape.o AAM_CAM.o AAM_PAW.o AAM_PDM.o AAM_TDM.o AAM_MovieAVI.o AAM_Basic.o AAM_IC.o

all: $(PROGRAMS)

AAM_Util.o: AAM_Util.cpp AAM_Util.h 
    g++  $(CPPFLAGS)  -c -o AAM_Util.o AAM_Util.cpp

AAM_Shape.o: AAM_Shape.cpp AAM_Shape.h
    g++  $(CPPFLAGS)  -c -o AAM_Shape.o AAM_Shape.cpp

AAM_TDM.o: AAM_TDM.cpp AAM_TDM.h 
    g++  $(CPPFLAGS)  -c -o AAM_TDM.o AAM_TDM.cpp

AAM_PDM.o: AAM_PDM.cpp AAM_PDM.h 
    g++  $(CPPFLAGS)  -c -o AAM_PDM.o AAM_PDM.cpp

AAM_PAW.o: AAM_PAW.cpp AAM_PAW.h
    g++  $(CPPFLAGS)  -c -o AAM_PAW.o AAM_PAW.cpp

AAM_CAM.o: AAM_CAM.cpp AAM_CAM.h 
    g++  $(CPPFLAGS)  -c -o AAM_CAM.o AAM_CAM.cpp

VJfacedetect.o: VJfacedetect.cpp VJfacedetect.h 
    g++  $(CPPFLAGS)  -c -o VJfacedetect.o VJfacedetect.cpp

AAM_MovieAVI.o: AAM_MovieAVI.cpp AAM_MovieAVI.h
    g++  $(CPPFLAGS)  -c -o AAM_MovieAVI.o AAM_MovieAVI.cpp

AAM_Basic.o: AAM_Basic.cpp AAM_Basic.h
    g++  $(CPPFLAGS)  -c -o AAM_Basic.o AAM_Basic.cpp

AAM_IC.o: AAM_IC.cpp AAM_IC.h 
    g++  $(CPPFLAGS)  -c -o AAM_IC.o AAM_IC.cpp

demo_build.o: train.cpp
    g++  $(CPPFLAGS)  -c -o demo_build.o train.cpp

demo_fit.o: fit.cpp
    g++  $(CPPFLAGS)  -c -o demo_fit.o fit.cpp

libaamlibrary.a: $(OBJS) 
    ar cru libaamlibrary.a $(OBJS)
    ranlib libaamlibrary.a

libaamlibrary.dll.a: $(OBJS)
    g++ -fPIC -shared $(OBJS) $(LIBS) -o cygaamlibrary-2.dll -Wl,--enable-auto-image-base -Xlinker --out-implib -Xlinker libaamlibrary.dll.a

fit: demo_fit.o
    g++ -o fit demo_fit.o libaamlibrary.dll.a $(LIBS) 

build: demo_build.o
    g++ -o build demo_build.o libaamlibrary.dll.a $(LIBS)

clean:
    rm -f *.o $(PROGRAMS)

Ответы [ 2 ]

0 голосов
/ 25 июня 2011

Я согласен с тем, что вам не следует использовать расширение .dll.a или .dll (я считаю, что .a и .so подходят), но кажется, что вы не можете обойтись без libaamlibrary [.dll] .a.

Так как '--enable-auto-image-base' имеет префикс -Wl, это делает его опцией компоновщика (ld).

Я искал 'man ld' и придумал это:

- enable-auto-image-base Автоматически выбирать базу изображений для библиотек DLL, если она не указана с помощью аргумента "--image-base".Используя хеш, сгенерированный из имени dll для создания уникальных баз изображений для каждой DLL, можно избежать коллизий и перемещений в памяти, которые могут задержать выполнение программы.[Эта опция специфична для целевого порта i386 PE компоновщика]

Какая у вас платформа?Это не доступно для не i386 архитектур, как я понимаю, и, возможно, не нужно?Можете ли вы попробовать компилировать без него?

Кстати, я рекомендую использовать отличный пакет Autotools (automake / autoconf / libtool).

Что касается --out-implib, то он также недоступен вamd64.

- файл out-implib Компоновщик создаст файл, который будет содержать импортную библиотеку, соответствующую библиотеке DLL, которую генерирует компоновщик.Эта библиотека импорта (которая должна называться « .dll.a» или « .a» может использоваться для связывания клиентов с созданной DLL; такое поведение позволяет пропустить отдельную библиотеку импорта «dlltool»)шаг создания. [Этот параметр относится только к целевому порту i386 PE компоновщика]

Извините, но я не знаю, что такое библиотека импорта.

0 голосов
/ 25 июня 2011

Практический подход: сначала попробуйте собрать без всего, что .dll и .dll.a; просто удалите строки, которые относятся к таким целям.

Кажется, .dll.a файлы - это статические архивы, содержащие позиционно-независимый код (PIC), которые необходимы в сценариях расширенного связывания, т.е. если вы сами разрабатываете разделяемые библиотеки. (Даже если вам нужна такая вещь, вы не должны называть это .dll.a в Linux.)

...