我的项目包含几个共享一些常用代码的可执行文件.我想将公共代码放在可执行文件可以链接到的静态库中.(公共代码非常小,我不想处理共享库).
源树看起来像这样:
app1和app2都依赖于共同的代码.
此公共代码非常特定于应用程序,并且永远不需要由此目录树之外的其他项目使用.出于这个原因,我宁愿不在任何类型的全球位置安装库.
顶级CMakeLists.txt文件只是添加子目录:
project(toplevel)
cmake_minimum_required(VERSION 3.1)
add_subdirectory(common)
add_subdirectory(app1)
add_subdirectory(app2)
Run Code Online (Sandbox Code Playgroud)
公共库的CMakeLists.txt文件创建静态库并设置包含目录:
add_library(common STATIC common.cpp)
target_include_directories(common PUBLIC "${CMAKE_CURRENT_LIST_DIR}/include")
Run Code Online (Sandbox Code Playgroud)
可执行文件的文件如下所示:
project(app1)
cmake_minimum_required(VERSION 3.1)
add_executable(${PROJECT_NAME} main.cpp)
target_link_libraries(${PROJECT_NAME} common)
Run Code Online (Sandbox Code Playgroud)
现在我的问题.如果我从顶级项目目录运行CMake,我可以构建app1和app2并且它们可以成功构建.但是,如果我想构建这些项目中的单个项目(例如,通过从app1运行CMake)而不是从顶级目录构建,我会收到错误,因为common/include它没有添加到标题搜索路径中.
我明白为什么会这样.用于app1或app2的CMakeLists.txt文件中没有任何内容可以"拉入"常见内容.这只在顶层完成.
有没有解决方法,或者这种行为通常被认为是可接受的?关于我的设置是次优的吗?我只是觉得能够在我们开始开发越来越多使用这个公共库的可执行文件的情况下单独构建项目而不是从顶级构建项目会很好,但也许这是我不应该做的事情.关心.
我有一个产生库的项目:
project (myCoolLibrary)
ADD_LIBRARY(my_cool_library SHARED ${mysources_SRC})
Run Code Online (Sandbox Code Playgroud)
另一个应该使用这个库的项目:
find_package (myCoolLibrary REQUIRED)
INCLUDE_DIRECTORIES("${myCoolLibrary_INCLUDE_DIRS}" )
add_executable(myCoolExe ${my_sources_SRC} )
TARGET_LINK_LIBRARIES(myCoolExe ${myCoolLibrary_LIBRARIES} )
Run Code Online (Sandbox Code Playgroud)
有没有办法可以更改第一个文件,以便第二个文件自动运行?通过在第一个文件上运行CMake然后在输出上运行make,然后在第二个文件上运行CMake,CMake能够找到包吗?
我只是将第一个项目的构建地址提供给第二个包的答案也是可以接受的.
cmake ×2