Целевое имя «C: /path/to/lib/file.lib» зарезервировано или недопустимо для определенных функций CMake

Я пытаюсь написать простую программу на 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
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
1 639
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Если это цель, которую вы уже создали вне проекта, вы должны импортировать ее с помощью add_library(<name> IMPORTED). Кроме того, первым аргументом add_library всегда является <name>. Это означает, что вы не можете проложить туда путь.

о, я должен был прочитать документацию для этого. Спасибо. GLFW уже будет построен, потому что это библиотека, верно? (Мог бы я сделать то же самое для DLL?)

Callum 20.08.2018 12:21

Конечно, любой встроенный двоичный файл за пределами проекта должен быть импортирован, существует множество возможностей для настройки этих встроенных целей, например флаги компиляции, включать пути и т. д.

Yuki 20.08.2018 12:24

Нашел исправление! Я переместил каталог ../../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:

И для вашего случая:

Другие вопросы по теме