编辑:
使用文件和GLOB_RECURSE:
GLOB_RECURSE会产生类似规则GLOB名单,除了 它会遍历匹配的目录下的所有子目录和 匹配文件。
我建议你rearrenge文件是这样的:
app/
|_ src/
|_ include/
|_ CMakeLists.txt
so1/
|_ src/
|_ include/
|_ CMakeLists.txt
so2/
|_ src/
|_ include/
|_ CMakeLists.txt
so3/
|_ src/
|_ include/
|_ CMakeLists.txt
CMakeLists.txt
中的CMakeLists.txt在app文件夹:
SET (APP_NAME app)
# Print variables to stdout
MESSAGE (STATUS)
MESSAGE (STATUS "Configuring ${APP_NAME}:")
MESSAGE (STATUS)
# Source code files
FILE (GLOB_RECURSE SOURCE_FILES src/*.cpp include/*.h include/*.inl)
# Compiler options
IF (CMAKE_COMPILER_IS_GNUCXX)
ADD_DEFINITIONS (-ansi -Wall -Wextra -Werror -pthread)
ENDIF()
# Build application
ADD_EXECUTABLE (${APP_NAME} ${SOURCE_FILES})
TARGET_LINK_LIBRARIES (${APP_NAME}
${SO1_LIB}
${SO2_LIB}
${SO3_LIB}
)
INSTALL (TARGETS ${APP_NAME} RUNTIME DESTINATION bin PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_WRITE GROUP_EXECUTE WORLD_READ WORLD_EXECUTE)
中的CMakeLists.txt每个lib文件夹中会是这样的(相应地更改每个文件中的LIB_OUTPUT_NAME):
SET (LIB_OUTPUT_NAME so1)
# Print variables to stdout
MESSAGE (STATUS)
MESSAGE (STATUS "Configuring ${LIB_OUTPUT_NAME}:")
MESSAGE (STATUS)
# Source code, headers and test files
FILE (GLOB_RECURSE HEADER_FILES include/*.h include/*.inl)
FILE (GLOB_RECURSE SOURCE_FILES src/*.cpp include/*.h include/*.inl)
FILE (GLOB_RECURSE TEST_SRC_FILES tests/*.cpp tests/*.h tests/*.inl)
# Compiler options
IF (CMAKE_COMPILER_IS_GNUCXX)
ADD_DEFINITIONS (-ansi -Wall -Wextra -Werror -pthread)
ENDIF()
# Build library
ADD_LIBRARY (${LIB_OUTPUT_NAME} SHARED ${SOURCE_FILES})
然后在主要的CMakeLists.txt:
CMAKE_MINIMUM_REQUIRED (VERSION 2.6)
PROJECT (App CXX)
# Set common variables
IF ("${CMAKE_BUILD_TYPE}" STREQUAL "Release")
SET (BUILD_DIR build/release)
ELSE()
SET (BUILD_DIR build/debug)
ENDIF()
# Print variables to stdout
MESSAGE (STATUS)
MESSAGE (STATUS "Building App:")
MESSAGE (STATUS "change a configuration variable with: cmake -D<Variable>=<Value>")
MESSAGE (STATUS "CMAKE_INSTALL_PREFIX = ${CMAKE_INSTALL_PREFIX}")
MESSAGE (STATUS "CMAKE_BUILD_TYPE = ${CMAKE_BUILD_TYPE}")
MESSAGE (STATUS "CMAKE_PREFIX_PATH = ${CMAKE_PREFIX_PATH}")
MESSAGE (STATUS)
# Remove build directory on clean target
SET_DIRECTORY_PROPERTIES (PROPERTIES ADDITIONAL_MAKE_CLEAN_FILES ${BUILD_DIR})
# Include directories
INCLUDE_DIRECTORIES (
"app/include"
"so1/include"
"so2/include"
"so3/include"
)
# Add common compiler flags
IF (CMAKE_COMPILER_IS_GNUCXX)
SET(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CPP_FLAGS_RELEASE} -O2")
SET(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -O0 -g)
ENDIF()
# Build all dynamic Libraries
ADD_SUBDIRECTORY (smartmatic ${BUILD_DIR}/so1)
SET (SO1_LIB ${CMAKE_CURRENT_SOURCE_DIR}/${BUILD_DIR}/so1/so1.so)
ADD_SUBDIRECTORY (saes-runtime ${BUILD_DIR}/so2)
SET (SO2_LIB ${CMAKE_CURRENT_SOURCE_DIR}/${BUILD_DIR}/so2/so2.so)
ADD_SUBDIRECTORY (saes-devices ${BUILD_DIR}/so3)
SET (SO3_LIB ${CMAKE_CURRENT_SOURCE_DIR}/${BUILD_DIR}/so3/so3.so)
# Add dynamic lib to app build for linking.
ADD_SUBDIRECTORY (so1 ${BUILD_DIR}/so1)
SET (SO1_LIB ${CMAKE_CURRENT_SOURCE_DIR}/${BUILD_DIR}/so1/so1.so)
ADD_SUBDIRECTORY (so2 ${BUILD_DIR}/so2)
SET (SO2_LIB ${CMAKE_CURRENT_SOURCE_DIR}/${BUILD_DIR}/so2/so2.so)
ADD_SUBDIRECTORY (so3 ${BUILD_DIR}/so3)
SET (SO3_LIB ${CMAKE_CURRENT_SOURCE_DIR}/${BUILD_DIR}/so3/so3.so)
# Build Application
ADD_SUBDIRECTORY (app ${CMAKE_CURRENT_SOURCE_DIR}/${BUILD_DIR}/app)
更多信息:
http://www.cmake.org/cmake/help/cmake2.6docs.html
+1非常感谢您为您的帮助,但我还没有能够产生makefile文件。我有一些特别的问题:在你的文章中,什么说我正在制作共享对象?与动态库('-L/path/to/mylib -l mylib')的链接在哪里?包含似乎工作正常,我想这两个是现在唯一的左侧依赖关系。我可以用link_directories(“path/to/mylib”)添加路径,但是我不知道在'target_link_libraries(??? mylib)'中使用哪个名称。根据我的想法,'???'应该替换为每个产生的'.so'。 – Rubens 2013-05-04 14:12:03
我可能不清楚,但实际上我必须将每个'soN/soN.cpp,soN/soN.hpp'编译到一个共享库中,所以首先是'soN.o',然后,一个'soN.so'。我的意思是,我不会拥有一个独特的可执行文件,我只会拥有'N'共享对象'.so'。 – Rubens 2013-05-04 14:32:41
哦,这些都是动态库,那么你需要在每个文件夹CMakeLists,让我更新帖子。 – AngelCastillo 2013-05-04 15:30:43