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

Posted

技术标签:

【中文标题】目标名称“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 【发布时间】:2018-08-20 09:23:20 【问题描述】:

我正在尝试编写一个简单的 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

【问题讨论】:

【参考方案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)

注意target_link_libraries语句之后 add_executable。这就是你需要告诉 CMake 你将使用哪些库来链接的内容。

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

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

cmake-buildsystem(7) - CMake 3.12.3 Documentation

对于你的情况:

add library - CMake 3.12.3 Documentation target_link_libraries - CMake 3.12.3 Documentation

【讨论】:

【参考方案2】:

如果这是您已经在项目之外构建的目标,则必须使用 add_library(&lt;name&gt; IMPORTED) 导入它。此外,add_library 的第一个参数始终是&lt;name&gt;。这意味着你不能在那里放置路径。

【讨论】:

哦,我应该为此阅读文档。谢谢。 GLFW 已经构建好了,因为它是一个库,对吧? (我会为 DLL 做同样的事情吗?) 当然,任何在项目之外构建的二进制文件都必须导入,如何配置这些构建的目标有很多可能性,例如编译标志、包含路径等【参考方案3】:

我找到了解决办法!我将../../libraries 目录移动到了一个通用的/lib 目录中。我还将CMakeLists.txt 中的第 6 行和第 7 行替换为

include_directories($CMAKE_CURRENT_SOURCE_DIR/include;) 
link_directories($CMAKE_CURRENT_SOURCE_DIR/lib)

【讨论】:

以上是关于目标名称“C:/path/to/lib/file.lib”对于某些 CMake 功能是保留的或无效的的主要内容,如果未能解决你的问题,请参考以下文章

Vuforia - 如何使用目标名称保存文件?

OGNL setValue 目标为空

在 XCode 中更改项目和目标名称

将包含名称的文件从源复制到目标c#

SSIS:使用变量作为平面文件目标的名称

扩展父应用程序目标名称是不是有环境变量