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

时间:2016-07-03 09:50:42

标签: cmake

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

  1. 目标名称与定义目标的目录名称相同。
  2. 我正在使用RUNTIME_OUTPUT_DIRECTORY属性作为目标。
  3. 在这些条件下,我得到错误:

    • Linking CXX executable .
    • /usr/bin/ld: cannot open output file .: Is a directory

    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本身是一个简单的Hello World程序,使用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_world.dir/link.txt将关联目标设置为-o .,这显然不会起作用。

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

    我的工具是:

    • cmake version 3.5.1
    • Ubuntu 16.04 LTS(Xenial Xerus)
    • 克++ - 4.8

1 个答案:

答案 0 :(得分:2)

由于命令add_subdirectory(hello_world),您的顶级构建目录包含 hello_world 目录。

通过将RUNTIME_OUTPUT_DIRECTORY属性设置为顶级构建目录,您希望在那里创建名为 hello_world 的可执行文件。

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

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