интересующийся
311 / 282 / 93
Регистрация: 25.09.2010
Сообщений: 1,056
1

Makefile dynamic library creation error

03.08.2014, 17:01. Показов 2019. Ответов 12
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день. Создал 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
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.08.2014, 17:01
Ответы с готовыми решениями:

C:\Dev-Cpp\Makefile.win [Build Error] [Безымянный1.o] Error 1
C:\Dev-Cpp\Makefile.win Error 1 компилятор стал показывать такую ошибку, после того как я...

Dynamic Link Library (.dll)
Необходимо создать программу с использованием динамической библиотеки. А именно: создать...

Dynamic-Link Library: Теория + Практика
1. Теоретическая часть. Знакомство с Dynamic-Link Library. 1.1. Что такое DLL. 1.2....

Вопрос по теме Dynamic-Link Library: Теория + Практика
Здорова всем! Посмотрел тему Dynamic-Link Library: Теория + Практика и решил попробовать сделать...

12
Заблокирован
Автор FAQ
03.08.2014, 19:14 2
Цитата Сообщение от xtorne21st Посмотреть сообщение
Во всех хэдэрах стоит защита от повторного влючения.
Какая именно покажи.
0
интересующийся
311 / 282 / 93
Регистрация: 25.09.2010
Сообщений: 1,056
03.08.2014, 20:03  [ТС] 3
C++
1
2
3
4
#ifndef
#define
 
#endif
Проверил на синтаксические ошибки - нет. да и проект пустой - одна заготовка...

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

Не по теме:

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

0
интересующийся
311 / 282 / 93
Регистрация: 25.09.2010
Сообщений: 1,056
04.08.2014, 22:17  [ТС] 9
Как раз задача и состоит разбить всё на каталоги... К тому же ос - линукс. Всё равно благодарю за труд и интерес к теме . Будем копать дальше
0
Заблокирован
Автор FAQ
04.08.2014, 22:20 10
Цитата Сообщение от xtorne21st Посмотреть сообщение
ак раз задача и состоит разбить всё на каталоги...
- ну так хоть хедеры подключай с учётом уровня вложенности, записи хедеров в проекте подразумевают их наличе в одном каталоге с срр.
Цитата Сообщение от xtorne21st Посмотреть сообщение
К тому же среда разработки - линукс
- да хоть MacOS, в коде я ничего не увидел платформозависиомго а потому собираться будет везде, пути к хедерам тольок перебей в includ-ах
Поясняю : Хедер лежит на католг вверх в папке DIR тогда аттач
C++
1
 #include "..//DIR//header.h"
0
интересующийся
311 / 282 / 93
Регистрация: 25.09.2010
Сообщений: 1,056
04.08.2014, 23:59  [ТС] 11
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
#include "..//DIR//header.h"
В этом нет необходимости, так как я даю инклуд gcc в этой строчке:
Bash
1
$(CC) -c -o $@ $< $(INCLUDE) $(CFLAGS)
Добавлено через 51 секунду
Проблема не в компиляции, а именно в линковке разных объектников...
0
6045 / 2160 / 753
Регистрация: 10.12.2010
Сообщений: 6,005
Записей в блоге: 3
05.08.2014, 08:18 12
Лучший ответ Сообщение было отмечено xtorne21st как решение

Решение

Посмотрел ваш проект. Проблема воспроизвелась. Особых косяков нет кроме очепятки в StarXmlGlobal.h -- namespace написано с ошибкой. Вообще очень смахивает на баг гцц. Решений вижу пока два: или отказываетесь от вайлдкардов и делаете обычный мейкфайл который потом легче отладить, или добавляете ключи W1 и какой-то-там на разрешение множественных дефиниций.
1
интересующийся
311 / 282 / 93
Регистрация: 25.09.2010
Сообщений: 1,056
06.08.2014, 00:51  [ТС] 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.'
0
06.08.2014, 00:51
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.08.2014, 00:51
Помогаю со студенческими работами здесь

The ordinal 459 could not be located in the dynamic link library urlmon.dll
В общем,я не знал куда засунуть эту тему и написал сюда... Проблема такая... the ordinal 459...

File creation error - The request is not supported. странная ошибка в xcopy
Копирую файлы xcopy &quot;%userprofile%\Documents&quot; Q:\ /c /y /s Где Q:\ сетевой диск. Выдает такое:...

Unable to load dynamic library '/usr/lib/php/20151012/php_intl.dll __at Linux
Возникает ошибка --Unable to load dynamic library '/usr/lib/php/20151012/php_intl.dll Хотя...

Проблемы с подключением библиотек: Unknown(): Unable to load dynamic library 'C:PHPextensionsphp_exif.dll' - Не найдена указанная процедура.
Операционная система: Windows XP Pro Web-сервер: IIS Хочу подключить библиотеку php_exif.dll ...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru