【发布时间】:2011-07-19 13:25:06
【问题描述】:
简介:
我正在尝试使用 CMake 来获取跨平台编译脚本(适用于 Windows32 上的 VS 9.0 和适用于 Unix 的 Makefile)。
关于 add_subdirectory(),我遇到了一些我无法理解的事情。
让我给你看我的代码:
上下文:
我的一个名为“module1”的模块的架构是这样的:
- CMakeLists.txt
- 包括/
- file1.h
- file2.h
- *.h
- 源/
- file1.cpp
- file2.cpp
- *.cpp
- 测试/
- CMakeLists.txt
- 源/
- testfile1.cpp
- testfile2.cpp
我的整个应用程序的架构由这些模块组成,这些模块本身就是可以独立工作的项目。
我的目标:
我想将我的模块编译为库
我想用 test/ 文件夹中的代码测试库
这是我写的 CMakeLists:
这个是我模块根目录下的CMakeLists.txt。
#ENSURE MINIMUM VERSION OF CMAKE
cmake_minimum_required(VERSION 2.8)
#CONFIGURATION OF THE PROJECT
#NAME OF THE PROJECT
project(MyProject)
#OUTPUT OF THE PROJECT
set(LIBRARY_OUTPUT_PATH lib/${CMAKE_BUILD_TYPE})
#ADD THE HEADERS OF THE LIBRARY BEING CREATED
include_directories(include)
#ADD 3rd PARTY OPENCV LIBRARIES
find_package(OpenCV REQUIRED)
#ADD 3rd PARTY XERCES LIBRARIES
include_directories(${XERCES_INCLUDE_DIR})
link_directories(${XERCES_LIB_DIR})
set(Xerces_LIBS xerces-c_3D.lib)
#CONFIGURATION OF THE LIBRARY
file(GLOB_RECURSE MYPROJECT_MODULE_CXX src/*)
file(GLOB_RECURSE MYPROJECT_MODULE_HDR include/*)
#NAME OF THE PRESENT LIBRARY
set(MYPROJECT_MODULE_LIB_NAME myModuleLib)
add_library(${MYPROJECT_MODULE_LIB_NAME}
SHARED
${MYPROJECT_MODULE_CXX}
${MYPROJECT_MODULE_HDR}
)
target_link_libraries(${MYPROJECT_MODULE_LIB_NAME}
${OpenCV_LIBS}
${Xerces_LIBS}
)
#CONTINUE IN THE SUB FOLDERS
add_subdirectory(test)
然后,在 test/ 文件夹中,这里是 CMakeLists.txt
#ENSURE MINIMUM VERSION OF CMAKE
cmake_minimum_required(VERSION 2.8)
#CONFIGURATION OF THE PROJECT
#NAME OF THE PROJECT
project(MyProjectTest)
#OUTPUT OF THE PROJECT
set(EXECUTABLE_OUTPUT_PATH bin/${CMAKE_BUILD_TYPE})
#ADD OUR TESTED LIBRARY
include_directories(../include)
link_directories(../build/lib/${CMAKE_BUILD_TYPE})
#CONFIGURATION OF THE EXE
file(GLOB_RECURSE MYPROJECT_MODULE_TEST_CXX src/*)
#NAME OF THE PRESENT EXECUTABLE
set(MYPROJECT_MODULE_TEST_BIN_NAME myModuleTest)
add_executable(${MYPROJECT_MODULE_TEST_BIN_NAME}
${MYPROJECT_MODULE_TEST_CXX}
)
target_link_libraries(${MYPROJECT_MODULE_TEST_BIN_NAME}
${MYPROJECT_MODULE_LIB_NAME}
)
问题
CMake 输出正确的 MyProject.sln Visual Studio 9.0 解决方案,该解决方案在我与 OpenCV 和 Xerces(以及其他第 3 部分库)链接的库中成功编译。但是测试二进制文件没有输出任何 MyProjectTest.sln。
我想,(and read in the CMake documentation) add_subdirectory(dir) 用于在以下子目录中执行 CMake(我的意思是,名称再清楚不过了 :p !),所以不应该继续在 test/ 目录中创建 CMake 并创建我的 MyProjectTest.sln 解决方案?
我使用 GUI CMake 在我在模块根目录中创建的构建目录中运行根 CMakeLists.txt。当我探索构建目录时,我可以找到 MyProjet.sln,一个 test/ 文件夹,但其中没有 MyProjectTest.sln!
【问题讨论】:
-
你是对的,应该有一个 MyProjectTest.sln 解决方案。你的项目是公开的吗?您必须在问题中遗漏一些细节来解释为什么缺少它。您使用的是什么版本的 CMake?对于每个“项目”命令,都应该创建一个相应命名的 *.sln 文件。
-
我使用的是 CMake 2.8,它是一个构建树(这是他们在文档中使用的术语,表示我不在源树本身而是在构建目录中构建 bin )....感谢查看了我的代码,再看一遍我不明白为什么它不起作用...我想到了使用相对路径的cmake,因此无法在src树中继续...我迷失了 CMake...
标签: cmake build-system