我可以从多个目标制作一个库吗
Can I make a library from multiple targets?
我正在尝试学习cmake
,并已开始将旧的make
项目转换为cmake
。以下是我现在拥有的目录结构的简化版本:
CMakeLists.txt
src/
CMakeLists.txt
main.cpp
core/
CMakeLists.txt
/sourcecode, other cmakes, etc.
test/
CMakeLists.txt
someTest.cpp
目前,在我的根CMakeLists.txt
文件中,我只拥有以下内容:
cmake_minimum_required(VERSION 2.8)
project(all)
add_subdirectory(src)
add_subdirectory(test)
我想做的是让core/CMakeLists.txt
创建一个库,src/CMakeLists.txt
可以使用它来构建主可执行文件,test/CMakeLists
也可以加载它来构建单元测试。
所以我的src/core/CMakeLists.txt
文件目前看起来有点像这样:
cmake_minimum_required(VERSION 2.8)
project(core)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -Wpedantic -Wreorder -DBOOST_TEST_DYN_LINK -DBOOST_LOG_DYN_LINK ")
#some other directories in my core code:
add_subdirectory(display)
add_subdirectory(training)
add_subdirectory(utility)
#some packages I use...
find_package(Boost 1.55.0
COMPONENTS
log
program_options
serialization
thread
system
filesystem
REQUIRED)
find_package(GLUT REQUIRED)
find_package(OpenGL REQUIRED)
find_package(Eigen3 REQUIRED)
include_directories(
${PROJECT_SOURCE_DIR}
${EIGEN3_INCLUDE_DIR})
target_link_libraries(core
display
training
utility
${Boost_LIBRARIES}
${OPENGL_LIBRARIES}
${GLUT_LIBRARY}
${OpenMP_LIBRARIES})
因此,我的想法是,我现在有了一个core
目标,我可以简单地链接它来运行我的测试,一切都应该正常。然而,例如,当我尝试构建main
时,我得到:
Cannot specify link libraries for target "core" which is not built by this
project.
我想这可能是因为core
没有add_library
命令,但如果我添加add_library(core)
,我会得到这个错误:
You have called ADD_LIBRARY for library core without any source files. This typically indicates a problem with your CMakeLists.txt file
但我不想添加任何源文件;我只想让这个目标链接core
目录中的目标,并从test
生成一个我可以链接的目标。
很明显,我在这里缺少了一些核心知识,无论是cmake
还是工具链本身。感谢您的帮助:)
如果只想创建一个没有源文件的core目标,则需要像INTERFACE对象一样声明它。因此,尝试将以下代码添加到您的src/core/CMakeLists.txt
:
cmake_minimum_required(VERSION 3.0) # REQUIRED 3.x.x version
project(core)
...
# Here declare your core_interface target
add_library(core_interface INTERFACE)
target_link_libraries(core_interface INTERFACE
display
training
utility
${Boost_LIBRARIES}
${OPENGL_LIBRARIES}
${GLUT_LIBRARY}
${OpenMP_LIBRARIES})
正如你所看到的,如果你这样做,你需要升级你的CMake安装版本。
然后,你将构建你的测试或任何可执行文件,直接与这个接口目标链接:
add_executable(main main.cpp)
target_link_libraries(main core_interface)
相关文章:
- 如何(从固定列表中)选择一个数字序列,该序列将与目标数字相加
- 我的目标是编写一个程序来计算和存储字符串在字符数组中出现的位置
- C++ 如何将两个 makefile 对象目标规则(位于另一个文件夹中)合并到一个目标/规则中?
- 目标c是否需要一个标准来定义像c++11这样的内存模型
- 在VC++中从DLLMAIN内部调用D3D的CREATEDEVICE时,它会创建一个死锁(loaderlock?)。有没有办法克服这个问题?最终目标内
- 执行CMAKE目标的输出作为另一个目标的依赖
- 从源开始,在C++中找到网格上最接近目标的下一个点
- 如何在不定义目标变量大小的情况下逐个字符将字符串变量复制到另一个字符
- 一个函数怎么能完成它的目标,只是在返回主函数后崩溃?
- 如何根据目标体系结构将共享库链接到另一个共享库
- 如何只构建一个依赖项目标
- CMAKE:使用来自另一个目标的功能,而无需直接target_link_libraries
- 我有一个构造函数,但我需要将输出返回到 main.cpp.我无法使用获取字符串功能!!任何想法如何实现这一目标?
- 如何创建一个qmake函数来创建一个自定义的make目标
- 我如何在makefile中实现目标,在makefile中调用另一个目标
- DirectX10仅绘制一个渲染目标
- CMAKE:创建一个由预构建库组成的新库目标
- 将多个目标分组为一个目标
- 在哪些情况下,我应该保留多个目标,而不是在生成文件中保留一个目标
- 如何设置一个目标后的变量