В C++ у меня есть путь к библиотеке, который я знаю, как включать его при сборке с помощью файла CMakeLists.txt, но я не знаю, как его включать при сборке с помощью Makefile.
Я попытался применить решение спросил и ответил здесь, но оно не сработало. Содержимое Makefile приведено ниже. Имя библиотеки — «NumCpp». Полный путь к этой библиотеке на моем компьютере: C:\Users\ooo\tor\Robot\rainbow\NumCpp\include\.
В файле .cc я включаю библиотеку как #include "NumCpp.hpp"
Это файл CMakeLists.txt. Это будет включать и компилировать библиотеку NumCpp, если вы запустите ее в каталоге, содержащем NumCpp. Я не знаю, полезно ли показывать это, но я знаю, что могу подключить библиотеку таким образом.
cmake_minimum_required(VERSION 3.14)
project("HelloWorld" CXX)
add_executable(${PROJECT_NAME} main.cpp)
find_package(NumCpp 2.6.2 REQUIRED)
target_link_libraries(${PROJECT_NAME}
NumCpp::NumCpp
)
Makefile. Я пытался использовать INC_DIR, CFLAGS и DEPS, чтобы связать путь к библиотеке, но получаю сообщение об ошибке.
COMMON=/O2 /MT /EHsc /arch:AVX /I../include /Fe../bin/
cl_vars = 'C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.30.30705\bin\Hostx86\x86\cl.exe'
cl_var = 'cl'
INC_DIR = C:/Users/ooo/tor/Robot/rainbow/NumCpp/include/
CFLAGS=-c -Wall -I$(INC_DIR)
DEPS = NumCpp.hpp
all:
$(cl_var) $(COMMON) testxml.cc ../bin/mujoco210nogl.lib
$(cl_var) $(COMMON) testspeed.cc ../bin/mujoco210nogl.lib
$(cl_var) $(COMMON) compile.cc ../bin/mujoco210nogl.lib
$(cl_var) $(COMMON) derivative.cc /openmp ../bin/mujoco210nogl.lib
$(cl_var) $(COMMON) basic.cc ../bin/glfw3.lib ../bin/mujoco210.lib
$(cl_var) $(COMMON) record.cc ../bin/glfw3.lib ../bin/mujoco210.lib
$(cl_var) $(COMMON) simulate.cc ../include/uitools.c ../bin/glfw3.lib ../bin/mujoco210.lib
del *.obj
Ошибка...
simulate.cc(14): fatal error C1083: Cannot open include file: 'NumCpp.hpp': No such file or directory
Generating Code...
Compiling...
uitools.c
Generating Code...
make: *** [Makefile:16: all] Error 2
Хм. При ближайшем рассмотрении не похоже, что вы используете переменные CFLAGS, INC_DIR или DEPS вообще где-либо в вашем make-файле. Простое назначение этих переменных на самом деле ничего не делает, если вы не ссылаетесь на них где-то. Я полагаю, вы хотите использовать переменную COMMON, чтобы добавить включаемые пути.
«использовать переменную COMMON». Я попробовал косую черту, и это не помогло. Мне просто написать COMMON, а затем путь? Там уже есть строка с использованием COMMON. Когда я добавил к нему свой путь, я получил... LINK : fatal error LNK1181: cannot open input file 'C:\Users\ooo\tor\Robot\rainbow\NumCpp\include\.obj'





Эта строка присваивает значение переменной make-файла с именем COMMON:
COMMON=/O2 /MT /EHsc /arch:AVX /I../include /Fe../bin/
эта строка присваивает значение имени переменной make-файла cl_var:
cl_var = 'cl'
Эти строки в рецепте использовать (или "расширить") переменные cl_var и COMMON:
$(cl_var) $(COMMON) testxml.cc ../bin/mujoco210nogl.lib
(и т.д.)
Обратите внимание, что нигде в вашем make-файле вы никогда не использовать переменные cl_vars, CFLAGS, INC_DIR или DEPS, поэтому эти назначения переменных в основном бесполезны: бесполезны. С таким же успехом их может и не быть вовсе, они никак не влияют на ваш make-файл.
Если вы хотите добавить новый каталог в путь включения, вам нужно добавить его в переменную COMMON, потому что это переменная, которая будет использоваться. Поскольку вы используете Visual C++, а не компилятор POSIX, такой как GCC или Clang, синтаксис будет /I<path>, а не -I<path>.
Итак, вы должны попробовать что-то вроде этого:
INC_DIR = C:/Users/ooo/tor/Robot/rainbow/NumCpp/include/
COMMON = /O2 /MT /EHsc /arch:AVX /I../include /I$(INC_DIR) /Fe../bin/
Если вам нужна дополнительная информация, вам, вероятно, следует прочитать хотя бы введение в что-то вроде Руководство пользователя GNU make, чтобы получить общее представление о том, что такое make-файл и как он работает. SO не оборудована для предоставления полноценных руководств.
Всегда используйте прямую косую черту в качестве разделителей каталогов в make-файлах, а не обратную косую черту. Кроме того, этот makefile довольно бесполезен. С тем же успехом вы можете просто написать пакетный файл
.batи поместить в него строки компиляции, тогда вам не нужно будет беспокоиться о обратной косой черте. Вы просто используете make-файл как прославленный пакетный файл и не пользуетесь преимуществами каких-либо вещей, которые делают make-файлы полезными, например, избегаете ненужной перекомпиляции и т. д.