Неопределенная ссылка на Linux Makefile только при связывании объектов с исполняемым файлом [дубликат] ⇐ Linux
Неопределенная ссылка на Linux Makefile только при связывании объектов с исполняемым файлом [дубликат]
При использовании Makefile я получаю сообщение об ошибке неопределенная ссылка при связывании объектов с исполняемым файлом.
Но я уверен, что добавил путь включения и ссылку на библиотеку в настройках g++.
Для этого я копирую и вставляю C_FLAGS во все файлы Makefile, а путь к сторонней библиотеке — абсолютный путь.
Если мой сторонний путь неверен, make сообщит мне, что невозможно найти -lfftw3 при компиляции obj.
Это не так. Поэтому я уверен, что мой сторонний путь правильный.
Но почему я все еще получаю неопределенную ссылку? Спасибо за ответ!
Мой журнал ошибок:
g++ -g -O3 -lm -I/public/home/AAAAA/BBBBB/IBM/../../fftw3/include -L/public/ home/AAAAA/BBBBB/IBM/../../fftw3/lib -lfftw3 -fopenmp -std=c++1z -o /public/home/AAAAA/BBBBB/IBM/build/bin/IBM build/obj/ *.о build/obj/main.o: В функции `NeumannPESolver2D::NeumannPESolver2D(unsigned int, unsigned int)': /public/home/AAAAA/BBBBB/IBM/src/pe_solver/neumann_pe_solver_2d.h:48: неопределенная ссылка на `fftw_plan_dft_r2c_1d' build/obj/neumann_pe_solver_2d.o: В функции `NeumannPESolver2D::solve(No_bound_field&, Neumann_field&) [clone ._omp_fn.0]': neumann_pe_solver_2d.cpp:(.text+0x6c8): неопределенная ссылка на `fftw_execute_dft_r2c' build/obj/neumann_pe_solver_2d.o: В функции `NeumannPESolver2D::solve(No_bound_field&, Neumann_field&) [clone ._omp_fn.2]': neumann_pe_solver_2d.cpp:(.text+0xe90): неопределенная ссылка на `fftw_execute_dft_r2c' neumann_pe_solver_2d.cpp:(.text+0xf10): неопределенная ссылка на `fftw_execute_dft_r2c' Collect2: ошибка: ld вернул 1 статус выхода make: *** [все] Ошибка 1 Моя многоуровневая структура Makefile показана ниже. Существует только два типа Makefile. Один из них помещается в подпапку и является рекурсивным. Другой находится в верхней корневой папке и определяет, какую подпапку создавать.
└─ААААА └─BBBBB ├─fftw3 └─IBM │ Make-файл │ └─источник │ CMakeLists.txt │ main.cpp │ Make-файл │ ... │ ├─помощник │ airfoil_reader.hpp │ Make-файл │ ├─ns_solver │ ib_cylinder.hpp │ ... │ Make-файл │ ├─pe_solver │ Make-файл │ neumann_pe_solver_2d.cpp │ neumann_pe_solver_2d.h │ └─структуры поле.hpp Makefile вар.hpp Мой рекурсивный Makefile:
INCLUDE_DIR = -I../ FFTW_DIR = $(ROOT_DIR)/../../fftw3 C_FLAGS = -g -O3 -lm -I${FFTW_DIR}/include -L${FFTW_DIR}/lib -lfftw3 -fopenmp -std=c++1z SUBDIRS = $(shell ls -l | grep ^d | awk '{print $$9}') CUR_SOURCE = ${подстановочный знак *.cpp} CUR_OBJS = ${patsubst %.cpp, %.o, $(CUR_SOURCE)} все:$(SUBDIRS) $(CUR_OBJS) $(СУБДИРС):ЭКО сделать -C $@ $(CUR_OBJS):%.o:%.cpp $(CC) $(INCLUDE_DIR) $(C_FLAGS) -c $^ -o $(ROOT_DIR)/$(OBJS_DIR)/$@ ЭХО: @echo $(СУБДИАРЫ) Мой верхний корневой Makefile:
CC = g++ SUBDIRS=$(shell ls -l | grep ^d | awk '{if($$9 != "build") print $$9}') ROOT_DIR=$(пароль оболочки) БИН=ИБМ OBJS_DIR=сборка/объект BIN_DIR=сборка/bin экспорт CC BIN OBJS_DIR BIN_DIR ROOT_DIR FFTW_DIR = $(ROOT_DIR)/../../fftw3 C_FLAGS = -g -O3 -lm -I${FFTW_DIR}/include -L${FFTW_DIR}/lib -lfftw3 -fopenmp -std=c++1z все: сделать -C $(СУБДИАРЫ) $(CC) $(C_FLAGS) -o $(ROOT_DIR)/$(BIN_DIR)/$(BIN) $(OBJS_DIR)/*.o .PHONY: очистить, очистить, все чистый: rm -rf ${BIN_DIR} очистить все: rm -rf сборка сборка mkdir мкдир ${OBJS_DIR} мкдир ${BIN_DIR} Я попробовал скопировать и вставить C_FLAGS во все файлы Makefile, и путь к сторонней библиотеке является абсолютным.
Поскольку все компиляции g++ имеют одинаковые параметры, они всегда должны быть правильными, но это не так.
Я ожидаю компиляции objs.
Кстати, я написал однофайловую версию, и она успешно скомпилируется:
FFTW_DIR = ../../fftw3 IBM: ./c_oop_ib_demo.cpp g++ $^ -g -O3 -lm -I${FFTW_DIR}/include -L${FFTW_DIR}/lib -lfftw3 -fopenmp -std=c++11 -o $@
При использовании Makefile я получаю сообщение об ошибке неопределенная ссылка при связывании объектов с исполняемым файлом.
Но я уверен, что добавил путь включения и ссылку на библиотеку в настройках g++.
Для этого я копирую и вставляю C_FLAGS во все файлы Makefile, а путь к сторонней библиотеке — абсолютный путь.
Если мой сторонний путь неверен, make сообщит мне, что невозможно найти -lfftw3 при компиляции obj.
Это не так. Поэтому я уверен, что мой сторонний путь правильный.
Но почему я все еще получаю неопределенную ссылку? Спасибо за ответ!
Мой журнал ошибок:
g++ -g -O3 -lm -I/public/home/AAAAA/BBBBB/IBM/../../fftw3/include -L/public/ home/AAAAA/BBBBB/IBM/../../fftw3/lib -lfftw3 -fopenmp -std=c++1z -o /public/home/AAAAA/BBBBB/IBM/build/bin/IBM build/obj/ *.о build/obj/main.o: В функции `NeumannPESolver2D::NeumannPESolver2D(unsigned int, unsigned int)': /public/home/AAAAA/BBBBB/IBM/src/pe_solver/neumann_pe_solver_2d.h:48: неопределенная ссылка на `fftw_plan_dft_r2c_1d' build/obj/neumann_pe_solver_2d.o: В функции `NeumannPESolver2D::solve(No_bound_field&, Neumann_field&) [clone ._omp_fn.0]': neumann_pe_solver_2d.cpp:(.text+0x6c8): неопределенная ссылка на `fftw_execute_dft_r2c' build/obj/neumann_pe_solver_2d.o: В функции `NeumannPESolver2D::solve(No_bound_field&, Neumann_field&) [clone ._omp_fn.2]': neumann_pe_solver_2d.cpp:(.text+0xe90): неопределенная ссылка на `fftw_execute_dft_r2c' neumann_pe_solver_2d.cpp:(.text+0xf10): неопределенная ссылка на `fftw_execute_dft_r2c' Collect2: ошибка: ld вернул 1 статус выхода make: *** [все] Ошибка 1 Моя многоуровневая структура Makefile показана ниже. Существует только два типа Makefile. Один из них помещается в подпапку и является рекурсивным. Другой находится в верхней корневой папке и определяет, какую подпапку создавать.
└─ААААА └─BBBBB ├─fftw3 └─IBM │ Make-файл │ └─источник │ CMakeLists.txt │ main.cpp │ Make-файл │ ... │ ├─помощник │ airfoil_reader.hpp │ Make-файл │ ├─ns_solver │ ib_cylinder.hpp │ ... │ Make-файл │ ├─pe_solver │ Make-файл │ neumann_pe_solver_2d.cpp │ neumann_pe_solver_2d.h │ └─структуры поле.hpp Makefile вар.hpp Мой рекурсивный Makefile:
INCLUDE_DIR = -I../ FFTW_DIR = $(ROOT_DIR)/../../fftw3 C_FLAGS = -g -O3 -lm -I${FFTW_DIR}/include -L${FFTW_DIR}/lib -lfftw3 -fopenmp -std=c++1z SUBDIRS = $(shell ls -l | grep ^d | awk '{print $$9}') CUR_SOURCE = ${подстановочный знак *.cpp} CUR_OBJS = ${patsubst %.cpp, %.o, $(CUR_SOURCE)} все:$(SUBDIRS) $(CUR_OBJS) $(СУБДИРС):ЭКО сделать -C $@ $(CUR_OBJS):%.o:%.cpp $(CC) $(INCLUDE_DIR) $(C_FLAGS) -c $^ -o $(ROOT_DIR)/$(OBJS_DIR)/$@ ЭХО: @echo $(СУБДИАРЫ) Мой верхний корневой Makefile:
CC = g++ SUBDIRS=$(shell ls -l | grep ^d | awk '{if($$9 != "build") print $$9}') ROOT_DIR=$(пароль оболочки) БИН=ИБМ OBJS_DIR=сборка/объект BIN_DIR=сборка/bin экспорт CC BIN OBJS_DIR BIN_DIR ROOT_DIR FFTW_DIR = $(ROOT_DIR)/../../fftw3 C_FLAGS = -g -O3 -lm -I${FFTW_DIR}/include -L${FFTW_DIR}/lib -lfftw3 -fopenmp -std=c++1z все: сделать -C $(СУБДИАРЫ) $(CC) $(C_FLAGS) -o $(ROOT_DIR)/$(BIN_DIR)/$(BIN) $(OBJS_DIR)/*.o .PHONY: очистить, очистить, все чистый: rm -rf ${BIN_DIR} очистить все: rm -rf сборка сборка mkdir мкдир ${OBJS_DIR} мкдир ${BIN_DIR} Я попробовал скопировать и вставить C_FLAGS во все файлы Makefile, и путь к сторонней библиотеке является абсолютным.
Поскольку все компиляции g++ имеют одинаковые параметры, они всегда должны быть правильными, но это не так.
Я ожидаю компиляции objs.
Кстати, я написал однофайловую версию, и она успешно скомпилируется:
FFTW_DIR = ../../fftw3 IBM: ./c_oop_ib_demo.cpp g++ $^ -g -O3 -lm -I${FFTW_DIR}/include -L${FFTW_DIR}/lib -lfftw3 -fopenmp -std=c++11 -o $@
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение