目标名称“ C:/path/to/lib/file.lib”已保留或对于某些CMake功能无效

时间:2018-08-20 09:23:21

标签: c++ cmake clion

我正在尝试编写一个简单的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是预先定义的。我看不到CMake如何预定义glfw3库的路径。 (如果那是问题。)

如果有关系,我的目录结构为:

C:/Users/callu/CLionProjects/Engine/
  ../lib
    ../GLFW
      glfw3.h
      glfw3Natives.h
      ../libraries
        glfw3.lib
        glfw3dll.lib
        glfw3.dll
  CMakeLists.txt
  main.cpp

3 个答案:

答案 0 :(得分:1)

如果这是您已经在项目外部构建的目标,则必须使用add_library(<name> IMPORTED)导入它。此外,add_library的第一个参数始终为<name>。这意味着您无法在其中放置路径。

答案 1 :(得分:1)

您的问题是 add_library 的错误使用。该语句用于从某些源集中创建一个库(在Windows上为.dll / .lib或在Unix上为.so / .a),并且您正试图使用​​它列出已编译/链接的库以用于链接可执行文件。

如果我的假设正确,则您的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)

add_executable 之后的注释 target_link_libraries 语句。这就是告诉CMake您将使用哪些库进行链接的方法。

顺便说一句,
如果您要强制执行C ++ 17标准,仅设置CMAKE_CXX_STANDARD变量是不够的,因为它允许(安静)衰减。在这种情况下,您还需要设置变量CMAKE_CXX_STANDARD_REQUIRED。

最后,我强烈建议阅读CMake文档:

对于您的情况:

答案 2 :(得分:0)

我找到了解决方法!我将../../libraries目录移到了公用/lib目录中。我还用

替换了CMakeLists.txt中的第6和7行
include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include;) 
link_directories(${CMAKE_CURRENT_SOURCE_DIR}/lib)