使文件夹中的所有文件可供所有项目(子目录)访问
Make all files in a folder accessible to all projects (subdirectories)
我的仓库中有多个项目(子目录(。所有项目都只有一个名为main.cpp
的可执行文件,并且它们都使用带有#include
语句的common
文件夹中的库。文件夹结构如下所示:
root
|
├────common
| ├──── example.h
| ├──── example.cpp
| ├──── *.h # many header files
| └──── *.cpp # many source files
|
├────Project_A
| ├──── CMakeLists.txt
| └──── main.cpp
|
├────Project_B
| ├──── CMakeLists.txt
| └──── main.cpp
|
└──── CMakeLists.txt
这是我编写根目录的CMakeList的尝试.txt
cmake_minimum_required (VERSION 3.8)
project ("root")
file(GLOB_RECURSE CommonLibs ${CMAKE_SOURCE_DIR}/common/*.cpp)
link_libraries(${CommonLibs})
add_subdirectory ("Project_A")
add_subdirectory ("Project_B")
Project_A的CMakeLists.txt
cmake_minimum_required (VERSION 3.8)
add_executable (Project_A "main.cpp")
Project_B的CMakeLists.txt
cmake_minimum_required (VERSION 3.8)
add_executable (Project_B "main.cpp")
但是,在运行任何项目时,我收到此错误:
LNK1107 invalid or corrupt file: cannot read at 0x7AC, file example.h
我不相信该文件已损坏,因为在我尝试在root的CMakeList中使用link_libraries()
之前.txt我遇到了其他错误:
Unresolved external symbol SomeNamespace::ExampleClass::ExampleClass(bool)
可能的重复项
诸如此类的其他问题无法解决我的问题,因为它们通常适用于更复杂的文件夹结构。还有一些问题试图只针对像这样的单个项目,但我有多个项目。
你能提供一个简洁的解决方案吗?
将CMakeLists.txt
添加到common/
目录中:
root
|
├────common
| ├──── CMakeLists.txt <-------- Add this
| ├──── example.h
....
常见/CMakeLists.txt
file(GLOB_RECURSE CommonLibsFiles ${CMAKE_CURRENT_SRC_DIR}/*.cpp)
add_library(CommonLibs ${CommonLibsFiles})
...
root的CMakeLists.txt
...
### NO NEED FOR THESE
file(GLOB_RECURSE CommonLibs ${CMAKE_SOURCE_DIR}/common/*.cpp)
link_libraries(${CommonLibs})
###
add_subdirectory(common) #CommonLibs will now be visible to children directories
...
现在根据需要链接库。例如,对于项目 A:
Project_A的CMakeList.txt
cmake_minimum_required (VERSION 3.8)
add_executable (Project_A "main.cpp")
target_link_libraries(Project_A PRIVATE CommonLibs) #link to common libs here,
创建的所有目标/变量或对父cmake 文件可见的所有目标/变量对子项都是可见的。但反之则不然。要使子项向父项公开其变量,它们需要显式指定PARENT_SCOPE
顶级 CMake 中的以下行没有多大意义:
file(GLOB_RECURSE CommonLibs ${CMAKE_SOURCE_DIR}/common/*.cpp)
link_libraries(${CommonLibs})
link_libraries()
命令接受库或库目标,而不是变量(如CommonLibs
(。您可以使用CommonLibs
变量定义新的库目标,然后使用以下link_libraries()
将库目标链接到可执行文件:
file(GLOB_RECURSE CommonLibs ${CMAKE_SOURCE_DIR}/common/*.cpp)
# Add this line.
add_library(MyCommonLib SHARED ${CommonLibs})
link_libraries(MyCommonLib)
请注意,一般不鼓励使用link_libraries()
,即使在 CMake 文档本身中也是如此。您应该更喜欢使用target_link_libraries
将MyCommonLib
链接到需要它的特定可执行文件。
target_link_libraries(Project_A PRIVATE MyCommonLib)
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 无法在 CLion 中构建 C++ 项目
- 运行同一解决方案的另一个项目的项目
- CMake-按正确顺序将项目与C运行时对象文件链接
- 如何在选项卡视图Qt中设置一个新项目,并保存以前的项目
- 欧拉项目#8答案是大以获得有效答案
- 从链接列表c++中删除一个项目
- CMake项目Boost库错误:Boost/config/compiler/gcc.hpp:165:10:致命错误:cs
- 既然存在危险,为什么项目要使用-I include开关
- cmake在我的项目中所需的所有静态库都不成功
- QT通过C++添加映射QML项目
- 在子目录中使用target_sources()命令时用于单元测试(qtest)的项目结构
- 使文件夹中的所有文件可供所有项目(子目录)访问
- Qt创建者:加载位于子目录中的项目文件
- CMake:防止在子目录库项目中生成测试可执行目标
- CMake:如何更改子目录项目目标的属性?
- CMake 共享项目子目录可避免重新生成
- 关于在一个有很多子目录的项目上使用make的反馈
- CMake——将子目录中的所有源代码添加到CMake项目中
- 如何构建具有多个相互依赖子目录的c++项目