我已经安装了最新版本的Boost /usr/local(包含in /usr/local/include/boost和库/usr/local/lib/boost),我现在正尝试从源代码安装Wt,但CMake(版本2.6)似乎无法找到Boost安装.它尝试提供有关设置BOOST_DIR和Boost_LIBRARYDIR的有用建议,但我无法通过调整这些变量来使其工作.
我得到的最新错误消息是它找不到库,但它似乎表明它正在使用"/ usr/local/include"作为包含路径,这是不正确的(我可以'似乎解决了这个问题).是否有一个解决方案,他们的头顶,或者我需要在CMake内部捣乱才能弄明白?
在CMake中,我似乎无法在../out/library中输出我的库,只有库.当我执行../out/library路径时,它告诉我它找不到库,就好像它想链接到它一样.
add_library(../out/JE3D ../source/CDeviceLayerSDL.cpp)
Run Code Online (Sandbox Code Playgroud)
有更多的文件,我只是在节省空间.当我这样做时,我得到了这个错误.
链接CXX静态库lib ../ out/JE3D.a/usr/bin/ar:lib ../ out/JE3D.a:没有这样的文件或目录make [2]:*[lib ../ out/JE3D. a]错误1 make [1]:* [CMakeFiles /../ out/JE3D.dir/all]错误2 make:***[all]错误2
我的项目包含几个共享一些常用代码的可执行文件.我想将公共代码放在可执行文件可以链接到的静态库中.(公共代码非常小,我不想处理共享库).
源树看起来像这样:
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文件中没有任何内容可以"拉入"常见内容.这只在顶层完成.
有没有解决方法,或者这种行为通常被认为是可接受的?关于我的设置是次优的吗?我只是觉得能够在我们开始开发越来越多使用这个公共库的可执行文件的情况下单独构建项目而不是从顶级构建项目会很好,但也许这是我不应该做的事情.关心.
我有几个项目(所有建筑都使用来自相同源树结构的CMake)都使用他们自己的混合数十个支持库.
所以我想到了如何在CMake中正确设置这个问题.到目前为止,我只发现CMake如何正确地创建目标之间的依赖关系,但我仍然在设置所有具有全局依赖关系(项目级别确实知道所有)或本地依赖关系(每个子级别目标仅处理其自己的依赖).
这里是我的目录结构的简化例子,我现在想出了使用CMake和本地依赖性(例子中只有一个可执行的项目,App1但也有更多的实际,App2,App3等):
Lib
+-- LibA
+-- Inc
+-- a.h
+-- Src
+-- a.cc
+-- CMakeLists.txt
+-- LibB
+-- Inc
+-- b.h
+-- Src
+-- b.cc
+-- CMakeLists.txt
+-- LibC
+-- Inc
+-- c.h
+-- Src
+-- c.cc
+-- CMakeLists.txt
App1
+-- Src
+-- main.cc
+-- CMakeLists.txt
Run Code Online (Sandbox Code Playgroud)
LIB /力霸/的CMakeLists.txt
include_directories(Inc ../LibC/Inc)
add_subdirectory(../LibC LibC)
add_library(LibA Src/a.cc Inc/a.h)
target_link_libraries(LibA LibC)
Run Code Online (Sandbox Code Playgroud)
LIB/LibB /的CMakeLists.txt
include_directories(Inc)
add_library(LibB Src/b.cc Inc/b.h)
Run Code Online (Sandbox Code Playgroud)
LIB /的LibC /的CMakeLists.txt
include_directories(Inc ../LibB/Inc)
add_subdirectory(../LibB LibB)
add_library(LibC …Run Code Online (Sandbox Code Playgroud) 我有一些项目遵循此依赖关系图
可执行的主库A,B和C.
Main // _ Depends_A_B_C
A // _ Depends_B
乙
C // Depends_B
使用add_subdirectory将A,B和C放在全局范围并将它们全部链接在一起的超级项目对我来说更有意义吗?
PROJ /
CMakeList.txt //为b,a,c,主顺序中的每个目录添加add_subdirectory.
一个/
b /
C/
主要/
或者我应该为他们制作find_package解决方案的麻烦.
主要/
A///安装到系统
B///安装到系统
C///已安装到系统
这些库正在开发中,因此很高兴能够将它们全部视为我的ide中的一个项目,但我不想滥用add_subdirectory来适应我的特定开发工具.
我只想下载via的git存储库cmake,并将源文件夹复制到其他地方.这是一个最小的工作示例:
cmake_minimum_required (VERSION 2.8)
project ("myProject")
include(ExternalProject)
# Download and copy the repository
set(PROJECT_NAME_CHIBIOS "ChibiOS")
ExternalProject_Add(${PROJECT_NAME_CHIBIOS}
PREFIX ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME_CHIBIOS}-Download
GIT_REPOSITORY https://github.com/ChibiOS/ChibiOS-RT.git
GIT_TAG b440caa10ced9532a467e4cbb96e1b3f0b99060a
CONFIGURE_COMMAND ""
BUILD_COMMAND "${CMAKE_COMMAND} -E copy_directory <SOURCE_DIR> ${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME_CHIBIOS}"
UPDATE_COMMAND ""
INSTALL_COMMAND ""
LOG_DOWNLOAD 1
LOG_UPDATE 1
LOG_CONFIGURE 1
LOG_BUILD 1
LOG_TEST 1
LOG_INSTALL 1
)
Run Code Online (Sandbox Code Playgroud)
除了复制命令之外的所有东西都是BUILD_COMMAND开箱即用的.make只是说:
Scanning dependencies of target ChibiOS
[ 12%] Creating directories for 'ChibiOS'
[ 25%] Performing download step (git clone) for 'ChibiOS'
-- ChibiOS download command succeeded. See …Run Code Online (Sandbox Code Playgroud) 我有一个产生库的项目:
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文件无法安装项目库.它在正确的位置创建目录,甚至递归安装头...但它无法安装库.怎么解决这个问题?
cmake_minimum_required(VERSION 2.8)
project(MyLib)
include_directories(include)
add_library(MyLib SHARED source/stuff.cpp)
if(CMAKE_SYSTEM MATCHES "Windows")
target_link_libraries(MyLib DbgHelp ws2_32 iphlpapi)
set(CMAKE_INSTALL_PREFIX "../../devel_artifacts")
endif(CMAKE_SYSTEM MATCHES "Windows")
install(TARGETS MyLib LIBRARY DESTINATION "lib"
ARCHIVE DESTINATION "lib"
COMPONENT library)
install(DIRECTORY include/${PROJECT_NAME} DESTINATION include)
Run Code Online (Sandbox Code Playgroud)