目标名称 "C:/path/to/lib/file.lib" 已保留或对某些 CMake 功能无效
The target name "C:/path/to/lib/file.lib" is reserved or not valid for certain CMake features
我正在尝试编写一个简单的 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
目录中。我还将 CMakeLists.txt
中的第 6 行和第 7 行替换为
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include;)
link_directories(${CMAKE_CURRENT_SOURCE_DIR}/lib)
您的问题是 add_library 的用法错误。此语句用于从某些源集创建一个库(Windows 上的 .dll/.lib 或 Unix 上的 .so/.a),并且您正在尝试使用它来列出已经 compiled/linked 用于链接可执行文件的库。
如果我的假设是正确的,您的 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 语句 after add_executable。这是您需要告诉 CMake 您将使用哪些库进行链接的内容。
顺便说一句,
如果您想强制执行 C++17 标准,仅设置 CMAKE_CXX_STANDARD 变量是不够的,因为它允许(安静)衰减。在这种情况下,您还需要设置变量 CMAKE_CXX_STANDARD_REQUIRED.
最后,我强烈建议阅读 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
如果这是您已经在项目外构建的目标,则必须使用 add_library(<name> IMPORTED)
将其导入。此外,add_library
的第一个参数始终是 <name>
。这意味着你不能在那里放置路径。
我找到了修复方法!我将 ../../libraries
目录移动到公共 /lib
目录中。我还将 CMakeLists.txt
中的第 6 行和第 7 行替换为
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include;)
link_directories(${CMAKE_CURRENT_SOURCE_DIR}/lib)
您的问题是 add_library 的用法错误。此语句用于从某些源集创建一个库(Windows 上的 .dll/.lib 或 Unix 上的 .so/.a),并且您正在尝试使用它来列出已经 compiled/linked 用于链接可执行文件的库。
如果我的假设是正确的,您的 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 语句 after add_executable。这是您需要告诉 CMake 您将使用哪些库进行链接的内容。
顺便说一句,
如果您想强制执行 C++17 标准,仅设置 CMAKE_CXX_STANDARD 变量是不够的,因为它允许(安静)衰减。在这种情况下,您还需要设置变量 CMAKE_CXX_STANDARD_REQUIRED.
最后,我强烈建议阅读 CMake 文档:
对于你的情况: