CMake子目录将主目录及其项目文件放在一起
我正在尝试在项目中使用库。我下载了它,并把它放在我保存项目所需的所有外部库的文件夹中 当我将库作为子目录添加到CMakeLists.txt并运行cmake时,库的CMakeLists.txt会将其许可证(替换我的许可证)和许多其他文件复制到cmake_BINARY_目录 我不希望他们在那里。我想把这些文件保存在图书馆自己的目录中。我如何做到这一点 我可以在调用子目录之前设置CMAKE_BINARY_DIR吗 我不希望编辑库的CMakeLists.txt 以下是复制文件: CMakeLists.txt:CMake子目录将主目录及其项目文件放在一起,cmake,Cmake,我正在尝试在项目中使用库。我下载了它,并把它放在我保存项目所需的所有外部库的文件夹中 当我将库作为子目录添加到CMakeLists.txt并运行cmake时,库的CMakeLists.txt会将其许可证(替换我的许可证)和许多其他文件复制到cmake_BINARY_目录 我不希望他们在那里。我想把这些文件保存在图书馆自己的目录中。我如何做到这一点 我可以在调用子目录之前设置CMAKE_BINARY_DIR吗 我不希望编辑库的CMakeLists.txt 以下是复制文件: CMakeLists.t
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。”是问题的一部分。这些建议是否也会编译库?抱歉,错过了那个评论。不,你会事先编译它,因为它是一个外部依赖项。为什么你需要在项目中包含它(源代码方面)如果它从来没有被操作过?好问题。我想如果库总是为平台编译的话,它的可移植性会更好。现在我发现如果需要的话,最好让用户单独编译。