Я пытаюсь написать простую программу на C++ и включить библиотеку для GLFW.
Я использую CLion IDE, и вот мой CMakeLists.txt:
cmake_minimum_required(VERSION 3.12)
project(Engine)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_VERBOSE_MAKEFILE TRUE)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/lib/;)
add_library(${CMAKE_CURRENT_SOURCE_DIR}/lib/GLFW/libraries/glfw3.lib;)
add_executable(Engine main.cpp)
Ошибка CMake:
CMake Error at CMakeLists.txt:8 (add_library):
The target name
"C:/Users/callu/CLionProjects/Engine/lib/GLFW/libraries/glfw3.lib"
is reserved or not valid for certain CMake features, such as generator
expressions, and may result in undefined behavior.
Мой код:
#include <iostream>
#include "GLFW/glfw3.h"
int main() {
if (!glfwInit)
std::cout << "Failure" << std::endl;
else
std::cout << "Success!" << std::endl;
return 0;
}
Я осмотрелся и обнаружил, что одна из возможных причин заключается в том, что значение библиотеки используется CMake где-то еще. Например, если бы я использовал «test» в качестве библиотеки, CMake пожаловался бы, потому что test - это предопределенная вещь. Я не вижу, как путь к библиотеке glfw3 предопределен CMake. (Если это проблема.)
Если это важно, моя структура каталогов такова:
C:/Users/callu/CLionProjects/Engine/
../lib
../GLFW
glfw3.h
glfw3Natives.h
../libraries
glfw3.lib
glfw3dll.lib
glfw3.dll
CMakeLists.txt
main.cpp





Если это цель, которую вы уже создали вне проекта, вы должны импортировать ее с помощью add_library(<name> IMPORTED). Кроме того, первым аргументом add_library всегда является <name>. Это означает, что вы не можете проложить туда путь.
Конечно, любой встроенный двоичный файл за пределами проекта должен быть импортирован, существует множество возможностей для настройки этих встроенных целей, например флаги компиляции, включать пути и т. д.
Нашел исправление! Я переместил каталог ../../libraries в общий каталог /lib. Я также заменил строки 6 и 7 в CMakeLists.txt на
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include;)
link_directories(${CMAKE_CURRENT_SOURCE_DIR}/lib)
Ваша проблема - неправильное использование add_library. Этот оператор используется для создания библиотеки (.dll / .lib в Windows или .so / .a в Unix) из некоторого набора источников, и вы пытаетесь использовать его для перечисления уже скомпилированных / связанных библиотек, которые будут использоваться для связывание вашего исполняемого файла.
Если мои предположения верны, ваш файл CMakeLists.txt должен выглядеть следующим образом:
cmake_minimum_required(VERSION 3.12)
project(Engine)
set(CMAKE_CXX_STANDARD 17)
set (CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_VERBOSE_MAKEFILE TRUE)
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/lib)
add_executable(Engine main.cpp)
target_link_libraries (Engine ${CMAKE_CURRENT_SOURCE_DIR}/lib/GLFW/libraries/glfw3.lib)
Обратите внимание на оператор target_link_librariesпослеadd_executable. Это то, что вам нужно, чтобы сообщить CMake, какие библиотеки вы будете использовать для компоновки.
Кстати,
в случае, если вы хотите обеспечить соблюдение стандарта C++ 17, установки только переменной CMAKE_CXX_STANDARD недостаточно, поскольку она допускает (тихий) распад. В этом случае вам также необходимо установить переменную CMAKE_CXX_STANDARD_REQUIRED.
В конце я настоятельно рекомендую прочитать документацию CMake:
И для вашего случая:
о, я должен был прочитать документацию для этого. Спасибо. GLFW уже будет построен, потому что это библиотека, верно? (Мог бы я сделать то же самое для DLL?)