Используйте краткий макияж с организованной структурой каталогов. В частности, я не хочу редактировать Makefile для управления зависимостями с каждым новым дополнением источника. Предполагаемая структура каталогов: < /p>
Код: Выделить всё
./src # Source files written by me (.cpp, .h)
./build # Build artifacts (*.o, *.d)
./include # Source files not written by me
Код: Выделить всё
# Compiler flags
CXXFLAGS += -std=c++11 -Wall -Wextra -lpthread
PREFLAGS := -MMD -MP
# Executable
TARGET := main
# Source
SRC := src
INC := include
# Build
BUILD := build
# Include directories
INC_DIRS := $(INC) $(shell find $(SRC) -type d)
INC_FLAGS := $(addprefix -I,$(INC_DIRS))
# Dependency/output filenames
SRCS := $(shell find $(SRC) -name *.cpp)
OBJS := $(subst $(SRC)/,$(BUILD)/,$(addsuffix .o,$(basename $(SRCS))))
DEPS := $(OBJS:.o=.d)
$(TARGET): $(OBJS)
$(CXX) $(OBJS) -o $@
$(BUILD)/%.o: $(SRC)/%.cpp
mkdir -p $(dir $@)
$(CXX) $(CXXFLAGS) $(PREFLAGS) $(INC_FLAGS) -c -o $@ $<
-include $(DEPS)
Все работало нормально, пока я не попытался использовать типы из библиотеки concurrentQueue . Я создал простой файл заголовка с некоторыми Typedefs.
Код: Выделить всё
// types.h
#pragma once
#include "message.h"
#include "blockingconcurrentqueue.h"
typedef moodycamel::BlockingConcurrentQueue message_queue_t;
typedef moodycamel::BlockingConcurrentQueue tagged_message_queue_t;
Код: Выделить всё
message_queue_t send_queue;
tagged_message_queue_t receive_queue;
< /code>
, которые привели к следующим ошибкам линкера на окончательном шаге компиляции: < /p>
mkdir -p build/
g++ -std=c++11 -Wall -Wextra -lpthread -MMD -MP -Iinclude -Isrc -c -o build/main.o src/main.cpp
g++ build/main.o build/protocol.o build/args.o build/config.o build/message.o build/util.o -o main
build/main.o: In function `moodycamel::details::Semaphore::Semaphore(int)':
main.cpp:(.text._ZN10moodycamel7details9SemaphoreC2Ei[_ZN10moodycamel7details9SemaphoreC5Ei]+0x3e): undefined reference to `sem_init'
build/main.o: In function `moodycamel::details::Semaphore::~Semaphore()':
main.cpp:(.text._ZN10moodycamel7details9SemaphoreD2Ev[_ZN10moodycamel7details9SemaphoreD5Ev]+0x14): undefined reference to `sem_destroy'
collect2: error: ld returned 1 exit status
make: *** [main] Error 1
Я завершил еще один проект, в котором использовался та же самая библиотека condurentqueue и не имела проблем. Однако в этом проекте я написал конкретные цели Makefile для каждого *.cpp , который требовал от меня самостоятельно управлять зависимостями. От моего понимания, я не должен это делать. Единственные другие различия между предыдущим проектом, о котором я могу подумать, это то, что
- Не было каталога ./build . Все артефакты сборки были размещены в ./src
- Не было ./include каталог. Файлы concurrentQueue SRC были размещены в ./src.
Подробнее здесь: https://stackoverflow.com/questions/797 ... ly-library
Мобильная версия