Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
CMake子目录将主目录及其项目文件放在一起_Cmake - Fatal编程技术网

CMake子目录将主目录及其项目文件放在一起

CMake子目录将主目录及其项目文件放在一起,cmake,Cmake,我正在尝试在项目中使用库。我下载了它,并把它放在我保存项目所需的所有外部库的文件夹中 当我将库作为子目录添加到CMakeLists.txt并运行cmake时,库的CMakeLists.txt会将其许可证(替换我的许可证)和许多其他文件复制到cmake_BINARY_目录 我不希望他们在那里。我想把这些文件保存在图书馆自己的目录中。我如何做到这一点 我可以在调用子目录之前设置CMAKE_BINARY_DIR吗 我不希望编辑库的CMakeLists.txt 以下是复制文件: CMakeLists.t

我正在尝试在项目中使用库。我下载了它,并把它放在我保存项目所需的所有外部库的文件夹中

当我将库作为子目录添加到CMakeLists.txt并运行cmake时,库的CMakeLists.txt会将其许可证(替换我的许可证)和许多其他文件复制到cmake_BINARY_目录

我不希望他们在那里。我想把这些文件保存在图书馆自己的目录中。我如何做到这一点

我可以在调用子目录之前设置CMAKE_BINARY_DIR吗

我不希望编辑库的CMakeLists.txt

以下是复制文件:

CMakeLists.txt:

project(MYPROJECT)

add_subdirectory(annoyer)
project(ANNOYER)

file(COPY annoyingfile.txt DESTINATION ${CMAKE_BINARY_DIR})
烦扰者/CMakeLists.txt:

project(MYPROJECT)

add_subdirectory(annoyer)
project(ANNOYER)

file(COPY annoyingfile.txt DESTINATION ${CMAKE_BINARY_DIR})

运行
cmakecmakelists.txt
时,
hatteringfile.txt
将移动到顶部目录。我希望它停留在
hatter/

您应该尝试使用可选的第二个参数来添加子目录(),它允许您指定二进制目录。像这样:

add_subdirectory(annoyer, annoyer_bin)

这样可以避免因源代码构建中的烦恼而困扰您的烦恼问题,还可以将其输出分离到单独的子目录中。

CMAKE_BINARY_DIR
始终指顶级项目的二进制目录

使用
CMAKE\u CURRENT\u BINARY\u DIR
引用当前项目的二进制目录


对于
CMAKE\u SOURCE\u DIR
/
CMAKE\u CURRENT\u SOURCE\u DIR

使用外部项目模块也是如此。这将把它限制在自己的顶级目录中


然后,您需要显式地设置依赖项,并通过多种方法之一使用生成的二进制文件。

添加子目录(hatter)
之前,您是否尝试过
设置(CMAKE\u binary\u DIR hatter)
?奇怪的是,它可以工作。顺便说一句,设置CMAKE_BINARY_DIR应该是不可能的,在谷歌搜索了一段时间后,它似乎无法在某些平台上设置。我放弃了这个库。现在它在CMakeLists.txt:17上显示
CMake错误(消息):不允许在源代码构建中运行这将创建一个名为“烦恼者”的文件夹,并将CMake内容放入其中。HatteringFile.txt仍在被复制到顶层目录。然后可能需要修补Hatteringer的CmakeList,以更好的方式编写文件。这就是问题所在。真正的库在自己的子目录中有几十个CMakeLists.txt,它们都在做同样的事情。我宁愿不要碰它们。幸运的是,图书馆有很多行为良好的替代品。今天的教训:永远不要使用OpenImageIO。最后我几乎做到了。我原以为我可以找到一个图书馆来取代这个,但实际上最终没有找到任何一样好的。我分岔了这个项目,并按照你的回答修复了CMakeLists+1但不接受,因为这不符合不修改要求。问题中没有“不修改”要求。但是,如果这是一个可能不会改变的完全外部库,我建议将其作为一个单独的库保留,只需使用
target\u link\u库
include\u目录
(可能与a)
FIND\u包
(如果可用)b)
FIND\u库
或c)硬编码路径(使用
设置(…)
以确保可读性)抱歉,可能不够清晰。“我不希望编辑库的CMakeLists.txt。”是问题的一部分。这些建议是否也会编译库?抱歉,错过了那个评论。不,你会事先编译它,因为它是一个外部依赖项。为什么你需要在项目中包含它(源代码方面)如果它从来没有被操作过?好问题。我想如果库总是为平台编译的话,它的可移植性会更好。现在我发现如果需要的话,最好让用户单独编译。