我在CMake中遇到一个恼人的错误,其中包含以下条件:
RUNTIME_OUTPUT_DIRECTORY
属性作为目标。在这些条件下,我得到错误:
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中的错误,还是我做错了什么?是否有一些解决方法?
我的工具是:
答案 0 :(得分:2)
由于命令add_subdirectory(hello_world)
,您的顶级构建目录包含 hello_world 目录。
通过将RUNTIME_OUTPUT_DIRECTORY
属性设置为顶级构建目录,您希望在那里创建名为 hello_world 的可执行文件。
但是在单个目录中,不可能同时拥有文件和同名目录。
您需要重命名子目录或可执行文件,或更改目录以放置可执行文件。