如果目录名称匹配,则CMake尝试将其链接为可执行文件

如果目录名称匹配,则CMake尝试将其链接为可执行文件,cmake,Cmake,我在CMake中遇到了一个恼人的错误,其中存在以下条件: 目标名称与定义目标的目录的名称相同 我正在为目标使用RUNTIME\u OUTPUT\u目录属性 在这些情况下,我会得到以下错误: 链接CXX可执行文件。 /usr/bin/ld:无法打开输出文件。:是目录 CMake似乎试图构建一个名为的目标,显然是试图引用当前目录名而不是所需的目标名 这里有一个简单的例子。我的文件树是: /tmp/example$ tree . ├── build └── src ├── CMakeLi

我在CMake中遇到了一个恼人的错误,其中存在以下条件:

  • 目标名称与定义目标的目录的名称相同
  • 我正在为目标使用
    RUNTIME\u OUTPUT\u目录
    属性
  • 在这些情况下,我会得到以下错误:

    • 链接CXX可执行文件。
    • /usr/bin/ld:无法打开输出文件。:是目录
    CMake似乎试图构建一个名为
    的目标,显然是试图引用当前目录名而不是所需的目标名


    这里有一个简单的例子。我的文件树是:

    /tmp/example$ tree
    .
    ├── build
    └── src
        ├── CMakeLists.txt
        └── hello_world
            ├── CMakeLists.txt
            └── HelloWorld.cpp
    
    src/CMakeLists.txt:

    set (ARBITRARY_OUTPUT_DIR ${CMAKE_CURRENT_BINARY_DIR})
    add_subdirectory(hello_world)
    
    src/hello_world:

    add_executable(hello_world HelloWorld.cpp)
    set_property(TARGET hello_world PROPERTY RUNTIME_OUTPUT_DIRECTORY ${ARBITRARY_OUTPUT_DIR})
    
    …而
    HelloWorld.cpp
    本身就是一个简单的HelloWorld程序,带有
    main()
    方法


    我运行:

    /tmp/example/build$ cmake ../src/ -DCMAKE_BUILD_TYPE=Release -DCMAKE_C_COMPILER=gcc-4.8 -DCMAKE_CXX_COMPILER=g++-4.8 -G"Unix Makefiles"
    /tmp/example/build$ make VERBOSE=1
    
    我得到:

    [ 50%] Building CXX object hello_world/CMakeFiles/hello_world.dir/HelloWorld.o
    cd /tmp/example/build/hello_world && /usr/bin/g++-4.8     -O3 -DNDEBUG   -o CMakeFiles/hello_world.dir/HelloWorld.o -c /tmp/example/src/hello_world/HelloWorld.cpp
    [100%] Linking CXX executable .
    cd /tmp/example/build/hello_world && /usr/bin/cmake -E cmake_link_script CMakeFiles/hello_world.dir/link.txt --verbose=1
    /usr/bin/g++-4.8   -O3 -DNDEBUG   CMakeFiles/hello_world.dir/HelloWorld.o  -o . -rdynamic
    /usr/bin/ld: cannot open output file .: Is a directory
    collect2: error: ld returned 1 exit status
    
    如您所见,
    CMakeFiles/hello\u world.dir/link.txt
    将链接目标设置为
    -o.
    ,这显然不起作用


    这是CMake中的错误,还是我做错了什么?是否有一些解决方法?

    我的工具是:

    • cmake版本3.5.1
    • Ubuntu 16.04 LTS(Xenial Xerus)
    • g++-4.8

    由于命令
    添加子目录(hello\u world)
    ,您的顶级生成目录包含hello\u world目录

    通过将
    RUNTIME\u OUTPUT\u DIRECTORY
    property设置为顶级生成目录,您希望在其中创建名为hello\u world的可执行文件

    但在单个目录中,不可能同时具有同名的文件和目录


    您需要重命名子目录或可执行文件,或者更改目录以放置可执行文件。

    arrg。我没有想到这一点。谢谢:D