Tag: cmake

什么是cmake相当于'configure –prefix = DIR && make all install'?

我做cmake . && make all install cmake . && make all install 。 这工作,但安装到/usr/local 。 我需要安装到不同的前缀(例如,到/usr )。 什么是cmake和make命令行安装到/usr而不是/usr/local ?

如何使用CMake链接C ++程序和Boost

我的cmake文件应该看起来像在Ubuntu下连接我的程序与boost库吗? 运行make时显示错误: main.cpp:(.text+0x3b): undefined reference to `boost::program_options::options_description::m_default_line_length' 主文件非常简单: #include <boost/program_options/options_description.hpp> #include <boost/program_options/option.hpp> using namespace std; #include <iostream> namespace po = boost::program_options; int main(int argc, char** argv) { po::options_description desc("Allowed options"); desc.add_options() ("help", "produce help message") ; return 0; } 我设法做到这一点,我已经添加到我的cmake文件的唯一线路是: target_link_libraries( my_target_file ${Boost_PROGRAM_OPTIONS_LIBRARY} )

如何开始使用GTest和CMake

我最近被出售使用CMake编译我的C ++项目,现在想开始为我的代码编写一些unit testing。 我决定使用Googletesting实用程序来帮助解决这个问题,但需要一些帮助才能入门。 我一整天都在阅读各种指南,例子包括Primer , IBM的介绍以及一些关于SO( 这里和这里 )的问题以及我失去的其他来源。 我意识到有很多,但不知何故,我仍然有困难。 我目前正在尝试执行最基本的testing,以确认我编译/安装gtest的权利,它不工作。 唯一的源文件(testgtest.cpp)几乎完全取自以前的答案: #include <iostream> #include "gtest/gtest.h" TEST(sample_test_case, sample_test) { EXPECT_EQ(1, 1); } 和我关联的CMakeLists.txt如下: cmake_minimum_required(VERSION 2.6) project(basic_test) # Setup testing enable_testing() find_package(GTest REQUIRED) include_directories(${GTEST_INCLUDE_DIR}) # Add test cpp file add_executable(runUnitTests testgtest.cpp ) # Link test executable against gtest & gtest_main target_link_libraries(runUnitTests ${GTEST_LIBRARY_DEBUG} ${GTEST_MAIN_LIBRARY_DEBUG}) add_test( NAME runUnitTests […]

如何正确添加包含CMake的目录?

大约一年前,我问了CMake中的头文件依赖关系 。 我最近意识到这个问题似乎是CMake认为这些头文件是项目外部的。 至less,在生成Code :: Blocks项目时,头文件不会出现在项目中(源文件)。 因此,在我看来,CMake认为这些头文件是项目外部的,并不依赖于它们。 在CMake教程快速search只指向include_directories这似乎并没有做我想要的… 什么是正确的方式来通知CMake一个特定的目录包含头文件,并且这些头文件应该由生成的Makefile进行跟踪?

使用CMake在GCC和Clang / LLVM之间切换

我有一些使用CMake构build的项目,我希望能够轻松地使用GCC或Clang / LLVM来编译它们。 我相信(如果我错了,请纠正我)要使用Clang,我需要设置以下内容: SET (CMAKE_C_COMPILER "/usr/bin/clang") SET (CMAKE_C_FLAGS "-Wall -std=c99") SET (CMAKE_C_FLAGS_DEBUG "-g") SET (CMAKE_C_FLAGS_MINSIZEREL "-Os -DNDEBUG") SET (CMAKE_C_FLAGS_RELEASE "-O4 -DNDEBUG") SET (CMAKE_C_FLAGS_RELWITHDEBINFO "-O2 -g") SET (CMAKE_CXX_COMPILER "/usr/bin/clang++") SET (CMAKE_CXX_FLAGS "-Wall") SET (CMAKE_CXX_FLAGS_DEBUG "-g") SET (CMAKE_CXX_FLAGS_MINSIZEREL "-Os -DNDEBUG") SET (CMAKE_CXX_FLAGS_RELEASE "-O4 -DNDEBUG") SET (CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2 -g") SET (CMAKE_AR "/usr/bin/llvm-ar") SET (CMAKE_LINKER "/usr/bin/llvm-ld") SET (CMAKE_NM […]

CMake中LINK_LIBRARIES的recursion列表

我正在尝试获取链接到CMake中特定目标的所有库的绝对path列表,以用于调用add_custom_command 。 但是, get_target_property(_LINK_LIBRARIES ${TARGET} LINK_LIBRARIES只包含直接依赖关系(即在target_link_libraries(${TARGET} …)调用中使用的任何东西)。 因此,如果我链接另一个CMake目标,例如mylibrary ,则该列表将包括mylibrary ,但仅作为名称,不包含传递链接的库。 由于该列表还可以包含任意复杂的生成器expression式,因此检查每个项目是否为目标并recursion检索其LINK_LIBRARIES不可行。 此外,目标可以在CMakeLists.txt的稍后时间点指定,并且if(TARGET mylibrary)将被跳过。 对于INCLUDE_DIRECTORIES和COMPILE_DEFINITIONS这很容易解决,因为尽pipeget_target_property在使用时(除了链接的目标明显不在列表中),它们的行为都是相似的, get_target_property $<TARGET_PROPERTY:${TARGET},INCLUDE_DIRECTORIES>recursion所需的包含和定义的期望列表。 但是, $<TARGET_PROPERTY:${TARGET},LINK_LIBRARIES>产生与get_target_property变体相同的列表。 我如何检索所需的绝对path列表? 示范: cmake_minimum_required(VERSION 2.8.12 FATAL_ERROR) file(WRITE a.cpp "void foo() {};\n") file(WRITE b.cpp "int main(int, char**) { return 0; }\n") find_package(Boost REQUIRED COMPONENTS filesystem system) add_library(A STATIC a.cpp) target_include_directories(A PUBLIC ${Boost_INCLUDE_DIRS}) target_link_libraries(A PUBLIC ${Boost_LIBRARIES}) # demonstrates (at configure […]

CMake共享库与多个可执行文件

我的项目包含几个共享一些通用代码的可执行文件。 我想把公共代码放在可执行文件可以链接到的静态库中。 (通用代码非常小,我不想处理共享库)。 源码树看起来像这样: 项目 的CMakeLists.txt 共同 的CMakeLists.txt SRC 包括 APP1 SRC 的CMakeLists.txt APP2 SRC 的CMakeLists.txt app1和app2都依赖于共同的代码。 这个通用代码是非常特定于应用程序的,并且永远不需要由此目录树之外的另一个项目使用。 出于这个原因,我宁愿不把这个库安装在任何一个全球的位置。 顶级CMakeLists.txt文件只是添加子目录: project(toplevel) cmake_minimum_required(VERSION 3.1) add_subdirectory(common) add_subdirectory(app1) add_subdirectory(app2) 公共库的CMakeLists.txt文件创build静态库并设置包含目录: add_library(common STATIC common.cpp) target_include_directories(common PUBLIC "${CMAKE_CURRENT_LIST_DIR}/include") 而可执行文件的文件如下所示: project(app1) cmake_minimum_required(VERSION 3.1) add_executable(${PROJECT_NAME} main.cpp) target_link_libraries(${PROJECT_NAME} common) 现在我的问题。 如果我从顶层项目目录运行CMake,我可以构buildapp1和app2,并成功构build。 但是,如果我想要构build这些项目中的一个(例如通过从app1运行CMake)而不是从顶层目录构build,则会出现错误,因为common/include不会添加到标头searchpath中。 我明白为什么会发生这种情况。 CMakeLists.txt文件中没有任何“引入”常见的app1或app2。 这只在顶层完成。 有没有办法解决这个问题,或者这种行为通常被认为是可以接受的? 是关于我的设置次优? 我只是想,如果我们开始开发使用这个通用库的越来越多的可执行文件,那么能够单独构build项目而不是从顶层构build项目会很好,但也许这是我不应该做的关心。

如何为cmake指定新的gccpath

我的操作系统是在path/usr/bin/gcc具有默认gcc的centos。 但是它已经老了,我需要一个新版本的gcc。 所以我在新path/usr/local/bin/gcc安装一个新版本。 但是当我运行cmake ,它仍然使用旧版本的gccpath( /usr/bin/gcc )。 我如何指定gcc到新path( /usr/local/bin/gcc )。 我试图用/usr/local/bin/gcc覆盖/usr/bin/gcc /usr/local/bin/gcc ,但是不行。

如何在CMake中设置警告级别?

如何使用CMake设置项目的警告级别 (而不是整个解决scheme)? 应该在Visual Studio和GCC上工作 。 我发现各种select,但大多数似乎要么不工作,或不符合文件。

是否有可能让CMakebuild立同一个库的静态和共享版本?

同样的来源,所有这一切,只是想要一个静态和共享的版本。 容易做到?