Форум программистов, компьютерный форум CyberForum.ru

Makefile dynamic library creation error - C++

Восстановить пароль Регистрация
 
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
03.08.2014, 17:01     Makefile dynamic library creation error #1
Добрый день. Создал makefile со следующим содержанием:
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# Project
PROJECT_NAME=StarXml
EXECUTABLE=StarXml
 
# Dirs
TARGET_DIR=bin
OBJECT_DIR=obj
INCLUDE_ROOT_DIR=include
INCLUDE_PROJ_DIR=$(INCLUDE_ROOT_DIR)/$(PROJECT_NAME)
SOURCE_ROOT_DIR=src
SOURCE_PROJ_DIR=$(SOURCE_ROOT_DIR)/$(PROJECT_NAME)
 
# Files
SOURCES_DEST=$(wildcard $(SOURCE_PROJ_DIR)/*.cpp)
SOURCES:=$(notdir $(SOURCES_DEST))
OBJECTS=$(patsubst %.cpp,%.o,$(SOURCES))
OBJECTS_DEST=$(patsubst %.o,$(OBJECT_DIR)/%.o,$(OBJECTS))
EXECUTABLE_DEST=$(patsubst $(EXECUTABLE),$(TARGET_DIR)/$(EXECUTABLE),$(EXECUTABLE))
 
# Command aliases
CC=g++
CFLAGS=-Wall -W -MD -pipe -g -O2 -fPIC
INCLUDE=$(addprefix -I./,$(INCLUDE_PROJ_DIR))
LDFLAGS=-ldl
 
# Post building
POST_COMPILE_STEP=dynamic_lib
LIBRARY_NAME=$(TARGET_DIR)/lib$(EXECUTABLE)
SHARED_LIBRARY_SUFFIX=.so
STATIC_LIBRARY_SUFFIX=.a
AR=ar
AR_ARGS=rc
 
# Building
all: $(OBJECTS_DEST) $(POST_COMPILE_STEP)
 
$(OBJECTS_DEST): $(SOURCES_DEST)
    @echo 'Building file: $<...'
    @echo 'Invoking GCC C++ Compiler...'
    $(CC) -c -o $@ $< $(INCLUDE) $(CFLAGS)
    @echo 'Finished building $<.'
    @echo ''
 
static_lib:
    @echo 'Creating static library...'
    $(AR) $(AR_ARGS) $(LIBRARY_NAME)$(STATIC_LIBRARY_SUFFIX) $(OBJECTS_DEST)
    @echo 'All done.'
 
dynamic_lib:
    @echo 'Creating dynamic library...'
    $(CC) -shared -o $(LIBRARY_NAME)$(SHARED_LIBRARY_SUFFIX) $(OBJECTS_DEST)
    @echo 'All done.'
 
clean:
    @echo 'Clean up...'
    rm -rf $(OBJECT_DIR)/*.o
    rm -rf $(OBJECT_DIR)/*.d
    @echo 'Done.'
Во всех хэдэрах стоит защита от повторного влючения. Во всех *.cpp включается исключительно соответствующий ему хэдер. Статическая библиотека создаётся нормально а вот с экзэкутабэл и динамической библиотекой проблемы:
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
Building file: src/StarXml/StarXmlManager.cpp...
Invoking GCC C++ Compiler...
g++ -c -o obj/StarXmlManager.o src/StarXml/StarXmlManager.cpp -I./include/StarXml -Wall -W -MD -pipe -g -O2 -fPIC
Finished building src/StarXml/StarXmlManager.cpp.
 
Building file: src/StarXml/StarXmlManager.cpp...
Invoking GCC C++ Compiler...
g++ -c -o obj/StarXmlParser.o src/StarXml/StarXmlManager.cpp -I./include/StarXml -Wall -W -MD -pipe -g -O2 -fPIC
Finished building src/StarXml/StarXmlManager.cpp.
 
Building file: src/StarXml/StarXmlManager.cpp...
Invoking GCC C++ Compiler...
g++ -c -o obj/StarXmlXsdValidator.o src/StarXml/StarXmlManager.cpp -I./include/StarXml -Wall -W -MD -pipe -g -O2 -fPIC
Finished building src/StarXml/StarXmlManager.cpp.
 
Creating dynamic library...
g++ -shared -o bin/libStarXml.so obj/StarXmlManager.o obj/StarXmlParser.o obj/StarXmlXsdValidator.o
obj/StarXmlParser.o: In function `StarXmlManager::init()':
/home/ilyuha21st/Dev/git/starXml/src/StarXml/StarXmlManager.cpp:38: multiple definition of `StarXmlManager::init()'
obj/StarXmlManager.o:/home/ilyuha21st/Dev/git/starXml/src/StarXml/StarXmlManager.cpp:38: first defined here
obj/StarXmlParser.o: In function `StarXmlManager::StarXmlManager()':
/home/ilyuha21st/Dev/git/starXml/src/StarXml/StarXmlManager.cpp:29: multiple definition of `StarXmlManager::StarXmlManager()'
obj/StarXmlManager.o:/home/ilyuha21st/Dev/git/starXml/src/StarXml/StarXmlManager.cpp:29: first defined here
obj/StarXmlParser.o: In function `StarXmlManager::StarXmlManager()':
/home/ilyuha21st/Dev/git/starXml/src/StarXml/StarXmlManager.cpp:29: multiple definition of `StarXmlManager::StarXmlManager()'
obj/StarXmlManager.o:/home/ilyuha21st/Dev/git/starXml/src/StarXml/StarXmlManager.cpp:29: first defined here
obj/StarXmlParser.o: In function `StarXmlManager::release()':
/home/ilyuha21st/Dev/git/starXml/src/StarXml/StarXmlManager.cpp:42: multiple definition of `StarXmlManager::release()'
obj/StarXmlManager.o:/home/ilyuha21st/Dev/git/starXml/src/StarXml/StarXmlManager.cpp:42: first defined here
obj/StarXmlParser.o: In function `StarXmlManager::~StarXmlManager()':
/home/ilyuha21st/Dev/git/starXml/src/StarXml/StarXmlManager.cpp:34: multiple definition of `StarXmlManager::~StarXmlManager()'
obj/StarXmlManager.o:/home/ilyuha21st/Dev/git/starXml/src/StarXml/StarXmlManager.cpp:34: first defined here
obj/StarXmlParser.o: In function `StarXmlManager::~StarXmlManager()':
/home/ilyuha21st/Dev/git/starXml/src/StarXml/StarXmlManager.cpp:34: multiple definition of `StarXmlManager::~StarXmlManager()'
obj/StarXmlManager.o:/home/ilyuha21st/Dev/git/starXml/src/StarXml/StarXmlManager.cpp:34: first defined here
obj/StarXmlXsdValidator.o: In function `StarXmlManager::init()':
/home/ilyuha21st/Dev/git/starXml/src/StarXml/StarXmlManager.cpp:38: multiple definition of `StarXmlManager::init()'
obj/StarXmlManager.o:/home/ilyuha21st/Dev/git/starXml/src/StarXml/StarXmlManager.cpp:38: first defined here
obj/StarXmlXsdValidator.o: In function `StarXmlManager::StarXmlManager()':
/home/ilyuha21st/Dev/git/starXml/src/StarXml/StarXmlManager.cpp:29: multiple definition of `StarXmlManager::StarXmlManager()'
obj/StarXmlManager.o:/home/ilyuha21st/Dev/git/starXml/src/StarXml/StarXmlManager.cpp:29: first defined here
obj/StarXmlXsdValidator.o: In function `StarXmlManager::StarXmlManager()':
/home/ilyuha21st/Dev/git/starXml/src/StarXml/StarXmlManager.cpp:29: multiple definition of `StarXmlManager::StarXmlManager()'
obj/StarXmlManager.o:/home/ilyuha21st/Dev/git/starXml/src/StarXml/StarXmlManager.cpp:29: first defined here
obj/StarXmlXsdValidator.o: In function `StarXmlManager::release()':
/home/ilyuha21st/Dev/git/starXml/src/StarXml/StarXmlManager.cpp:42: multiple definition of `StarXmlManager::release()'
obj/StarXmlManager.o:/home/ilyuha21st/Dev/git/starXml/src/StarXml/StarXmlManager.cpp:42: first defined here
obj/StarXmlXsdValidator.o: In function `StarXmlManager::~StarXmlManager()':
/home/ilyuha21st/Dev/git/starXml/src/StarXml/StarXmlManager.cpp:34: multiple definition of `StarXmlManager::~StarXmlManager()'
obj/StarXmlManager.o:/home/ilyuha21st/Dev/git/starXml/src/StarXml/StarXmlManager.cpp:34: first defined here
obj/StarXmlXsdValidator.o: In function `StarXmlManager::~StarXmlManager()':
/home/ilyuha21st/Dev/git/starXml/src/StarXml/StarXmlManager.cpp:34: multiple definition of `StarXmlManager::~StarXmlManager()'
obj/StarXmlManager.o:/home/ilyuha21st/Dev/git/starXml/src/StarXml/StarXmlManager.cpp:34: first defined here
collect2: error: ld returned 1 exit status
make: *** [dynamic_lib] Error 1
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.08.2014, 17:01     Makefile dynamic library creation error
Посмотрите здесь:

Makefile C++
Написание Makefile C++
C++ Создание makefile
Простой Makefile C++
makefile C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
-=ЮрА=-
Заблокирован
Автор FAQ
03.08.2014, 19:14     Makefile dynamic library creation error #2
Цитата Сообщение от xtorne21st Посмотреть сообщение
Во всех хэдэрах стоит защита от повторного влючения.
Какая именно покажи.
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
03.08.2014, 20:03  [ТС]     Makefile dynamic library creation error #3
C++
1
2
3
4
#ifndef
#define
 
#endif
Проверил на синтаксические ошибки - нет. да и проект пустой - одна заготовка...

Добавлено через 1 минуту
пробовал и #pragma once
проблема где-то в другом месте...
HighPredator
 Аватар для HighPredator
5350 / 1733 / 320
Регистрация: 10.12.2010
Сообщений: 5,119
Записей в блоге: 3
04.08.2014, 08:15     Makefile dynamic library creation error #4
Попробуйте так:
Код
dynamic_lib: $(OBJECTS_DEST)
    @echo 'Creating dynamic library...'
    $(CC) -shared -o $(LIBRARY_NAME)$(SHARED_LIBRARY_SUFFIX) $(OBJECTS_DEST)
    @echo 'All done.'
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
04.08.2014, 15:28  [ТС]     Makefile dynamic library creation error #5
Тоже самое... Весьмя странно. Может проблема в самой динамической линковке, а не в makefile. Щас попробую всё сделать вручную...
HighPredator
 Аватар для HighPredator
5350 / 1733 / 320
Регистрация: 10.12.2010
Сообщений: 5,119
Записей в блоге: 3
04.08.2014, 16:13     Makefile dynamic library creation error #6
Попробуйте у себя поотлаживаться. А то у меня даже воспроизвести ваш вывод не выходит. Или выложите ваш проект со всей иерархией.
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
04.08.2014, 20:23  [ТС]     Makefile dynamic library creation error #7
Прикрепил проект... за ранее спасибо
Вложения
Тип файла: 7z starXml.7z (2.4 Кб, 3 просмотров)
-=ЮрА=-
04.08.2014, 21:52
  #8

Не по теме:

В студии всё собралось, причём сразу, перебрось хедеры и срр в один каталог

xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
04.08.2014, 22:17  [ТС]     Makefile dynamic library creation error #9
Как раз задача и состоит разбить всё на каталоги... К тому же ос - линукс. Всё равно благодарю за труд и интерес к теме . Будем копать дальше
-=ЮрА=-
Заблокирован
Автор FAQ
04.08.2014, 22:20     Makefile dynamic library creation error #10
Цитата Сообщение от xtorne21st Посмотреть сообщение
ак раз задача и состоит разбить всё на каталоги...
- ну так хоть хедеры подключай с учётом уровня вложенности, записи хедеров в проекте подразумевают их наличе в одном каталоге с срр.
Цитата Сообщение от xtorne21st Посмотреть сообщение
К тому же среда разработки - линукс
- да хоть MacOS, в коде я ничего не увидел платформозависиомго а потому собираться будет везде, пути к хедерам тольок перебей в includ-ах
Поясняю : Хедер лежит на католг вверх в папке DIR тогда аттач
C++
1
 #include "..//DIR//header.h"
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
04.08.2014, 23:59  [ТС]     Makefile dynamic library creation error #11
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
#include "..//DIR//header.h"
В этом нет необходимости, так как я даю инклуд gcc в этой строчке:
Bash
1
$(CC) -c -o $@ $< $(INCLUDE) $(CFLAGS)
Добавлено через 51 секунду
Проблема не в компиляции, а именно в линковке разных объектников...
HighPredator
 Аватар для HighPredator
5350 / 1733 / 320
Регистрация: 10.12.2010
Сообщений: 5,119
Записей в блоге: 3
05.08.2014, 08:18     Makefile dynamic library creation error #12
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Посмотрел ваш проект. Проблема воспроизвелась. Особых косяков нет кроме очепятки в StarXmlGlobal.h -- namespace написано с ошибкой. Вообще очень смахивает на баг гцц. Решений вижу пока два: или отказываетесь от вайлдкардов и делаете обычный мейкфайл который потом легче отладить, или добавляете ключи W1 и какой-то-там на разрешение множественных дефиниций.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.08.2014, 00:51     Makefile dynamic library creation error
Еще ссылки по теме:

std threading library взамен boost threading library C++
C++ составить makefile
Make, makefile, simple makefile, hello_world C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
06.08.2014, 00:51  [ТС]     Makefile dynamic library creation error #13
В общем проблема ясна: пока нельзя собирать объектники по очереди. Только сразу все вместе...

Добавлено через 58 минут
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
# Project
PROJECT_NAME=StarXml
EXECUTABLE=StarXml
 
# Dirs
TARGET_DIR=bin
OBJECT_DIR=obj
INCLUDE_ROOT_DIR=include
INCLUDE_PROJ_DIR=$(INCLUDE_ROOT_DIR)/$(PROJECT_NAME)
SOURCE_ROOT_DIR=src
SOURCE_PROJ_DIR=$(SOURCE_ROOT_DIR)/$(PROJECT_NAME)
 
# Files
SOURCES_DEST=$(wildcard $(SOURCE_PROJ_DIR)/*.cpp)
SOURCES:=$(notdir $(SOURCES_DEST))
OBJECTS=$(patsubst %.cpp,%.o,$(SOURCES))
OBJECTS_DEST=$(patsubst %.o,$(OBJECT_DIR)/%.o,$(OBJECTS))
EXECUTABLE_DEST=$(patsubst $(EXECUTABLE),$(TARGET_DIR)/$(EXECUTABLE),$(EXECUTABLE))
 
# Command aliases
CC=g++
CFLAGS_NRM=-Wall -W -pedantic -MD -pipe -g -O2 -fPIC
CFLAGS_DBG=-Wall -W -pedantic -MD -pipe -g -O0 -fPIC
INCLUDE=$(addprefix -I./,$(INCLUDE_PROJ_DIR))
LDFLAGS=-ldl
 
# Post building
POST_COMPILE_STEP=dynamic_lib
LIBRARY_NAME=$(TARGET_DIR)/lib$(EXECUTABLE)
SHARED_LIBRARY_SUFFIX=.so
STATIC_LIBRARY_SUFFIX=.a
AR=ar
AR_ARGS=rc
 
# Building
.PHONY: noraml nrm debug dbg $(POST_COMPILE_STEP)
 
normal: nrm $(POST_COMPILE_STEP)
nrm:
    @echo 'Building noraml version...'
    @echo 'Invoking GCC C++ Compiler...'
    $(CC) -c $(SOURCES_DEST) $(INCLUDE) $(CFLAGS_NRM)
    mv *.o *.d ./obj
    @echo 'Finished building.'
    @echo ''
 
debug: dbg $(POST_COMPILE_STEP)
dbg:
    @echo 'Building debug version...'
    @echo 'Invoking GCC C++ Compiler...'
    $(CC) -c $(SOURCES_DEST) $(INCLUDE) $(CFLAGS_DBG)
    mv *.o *.d ./obj
    @echo 'Finished building.'
    @echo ''
 
static_lib:
    @echo 'Creating static library...'
    $(AR) $(AR_ARGS) $(LIBRARY_NAME)$(STATIC_LIBRARY_SUFFIX) $(OBJECTS_DEST)
    @echo 'All done.'
 
dynamic_lib:
    @echo 'Creating dynamic library...'
    $(CC) -shared $(INCLUDE) -o $(LIBRARY_NAME)$(SHARED_LIBRARY_SUFFIX) $(OBJECTS_DEST)
    @echo 'All done.'
 
clean:
    @echo 'Clean up...'
    rm -rf $(OBJECT_DIR)/*.o
    rm -rf $(OBJECT_DIR)/*.d
    @echo 'Done.'
Yandex
Объявления
06.08.2014, 00:51     Makefile dynamic library creation error
Ответ Создать тему
Опции темы

Текущее время: 06:10. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru