Questions tagged «cmake»

CMake是一个跨平台的开源构建系统生成器。它生成用于构建系统的文件,例如用于多个集成开发环境的本机makefile,ninja-build和项目文件。

4
C ++项目组织(带有gtest,cmake和doxygen)
我是编程的新手,所以我决定从用C ++创建一个简单的矢量类开始。但是,我想从一开始就养成良好的习惯,而不是稍后再尝试修改我的工作流程。 我目前只有两个文件vector3.hpp和vector3.cpp。随着我对一切的熟悉,这个项目将开始慢慢发展(使它更多地成为通用的线性代数库),因此我想采用“标准”项目布局,以使以后的生活更轻松。因此,环顾四周后,我发现了两种组织hpp和cpp文件的方法,第一种是: project └── src ├── vector3.hpp └── vector3.cpp 第二个是: project ├── inc │ └── project │ └── vector3.hpp └── src └── vector3.cpp 您会推荐哪个?为什么? 其次,我想使用Google C ++测试框架对我的代码进行单元测试,因为它似乎很容易使用。您是否建议将此与我的代码捆绑在一起,例如在inc/gtest或contrib/gtest文件夹中?如果捆绑在一起,您是否建议使用fuse_gtest_files.py脚本来减少数量或文件数量,或者保持原样?如果不捆绑在一起,该依赖性如何处理? 在编写测试时,通常如何组织这些测试?我当时想为每个类创建一个cpp文件(test_vector3.cpp例如),但是全部编译成一个二进制文件,以便它们可以轻松地一起运行? 由于gtest库通常是使用cmake和make构建的,所以我认为对我的项目也这样构建有意义吗?如果我决定使用以下项目布局: ├── CMakeLists.txt ├── contrib │ └── gtest │ ├── gtest-all.cc │ └── gtest.h ├── docs │ └── Doxyfile ├── inc …
123 c++  cmake  doxygen  googletest 

7
如何为CMake指定新的GCC路径
我的操作系统是centos,它在path中具有默认的gcc /usr/bin/gcc。但是它很旧,我需要新版本的gcc。因此,我在新路径中安装了新版本/usr/local/bin/gcc。 但是当我运行时cmake,它仍然使用旧版本的gcc path(/usr/bin/gcc)。如何指定gcc到新的path(/usr/local/bin/gcc)。 我试图覆盖/usr/bin/gcc有/usr/local/bin/gcc,但它不能正常工作。
122 gcc  cmake 

1
CMAKE中添加-fPIC编译器选项的惯用方式是什么?
我至少遇到了3种方法来做,我想知道哪种是惯用的方法。几乎所有静态库都需要这样做。我很惊讶CMake中的Makefile生成器没有自动将其添加到静态库中。(除非我想念什么?) target_compile_options(myLib PRIVATE -fPIC) add_compile_options(-fPIC) set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fpic") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fpic") 我相信可能还会有其他变化。(如果找到一个,请编辑我的问题) 如果您碰巧知道此问题的答案,您是否还知道是否有一种方法可以使第三方CMake项目使用此标志进行编译,而无需修改其CMakeLists.txt文件?我遇到了缺少该标志的静态库。在将静态库编译为动态库时会引起问题。 你得到: relocation R_X86_64_32 against `.rodata' can not be used when making a shared object; recompile with -fPIC
119 c++  c  cmake 

27
CMake找不到Visual C ++编译器
安装Visual Studio 2015并在以前的项目上运行CMake之后,CMake错误指出无法找到C编译器。 The C compiler identification is unknown The CXX compiler identification is unknown CMake Error at CMakeLists.txt:4 (PROJECT): No CMAKE_C_COMPILER could be found. CMake Error at CMakeLists.txt:4 (PROJECT): No CMAKE_CXX_COMPILER could be found. 我去cl.exeVisual Studio文件夹中搜索,C:\Program Files\Microsoft Visual Studio 14.0但找不到它。 如何设置CMake以在Windows和Visual Studio 2015上运行?

3
最简单但完整的CMake示例
某种程度上,我对CMake的工作方式完全感到困惑。每当我认为我越来越了解CMake的含义时,在我阅读的下一个示例中,它就消失了。我只想知道,我应该如何构造我的项目,以便将来CMake所需的维护最少。例如,当我在src树中添加新文件夹时,我不想更新CMakeList.txt,该文件夹的工作方式与所有其他src文件夹完全相同。 这就是我想象项目结构的方式,但是请仅这只是一个例子。如果建议的方法不同,请告诉我,并告诉我如何进行。 myProject src/ module1/ module1.h module1.cpp module2/ [...] main.cpp test/ test1.cpp resources/ file.png bin [execute cmake ..] 顺便说一句,重要的是我的程序必须知道资源在哪里。我想知道推荐的资源管理方式。我不想使用“ ../resources/file.png”访问我的资源
117 c++  cmake  project-setup 

3
Cmake vs Make示例代码?
我想知道是否有Makefiles(make)和CMakeLists.txt(cmake)的示例代码都做相同的事情(唯一的区别是一个写在make另一个中cmake)。 我尝试寻找“ cmake vs make”,但是我从未找到任何代码比较。即使只是简单的情况,了解这些差异也将非常有帮助。
117 makefile  cmake 

12
CMake无法找到OpenSSL库
我正在尝试安装一个软件,当我在Commandlin cmake上 给出命令时,它会使用cmake自行安装。需要OpenSSL):- cmake .. -- Could NOT find Git (missing: GIT_EXECUTABLE) ZLib include dirs: /usr/include ZLib libraries: /usr/lib/arm-linux-gnueabihf/libz.so Compiling with SSL support CMake Error at /usr/local/share/cmake-2.8/Modules/FindPackageHandleStandardArgs.cmake:97 (message): Could NOT find OpenSSL, try to set the path to OpenSSL root folder in the system variable OPENSSL_ROOT_DIR (missing: OPENSSL_LIBRARIES OPENSSL_INCLUDE_DIR) Call …
117 openssl  cmake 


5
CMake输出/构建目录
我是CMake的新手,阅读了一些有关如何使用它的教程,并编写了一些复杂的50行CMake脚本,以便为3个不同的编译器编写程序。这可能总结了我在CMake中的全部知识。 现在我的问题是我有一些源代码,制作程序时我不想碰到/碰到它们的文件夹。我希望所有CMake以及make输出文件和文件夹都进入其中../Compile/,因此我为此在CMake脚本中更改了一些变量,并且在我在笔记本电脑上执行以下操作时它起作用了: Compile$ cmake ../src Compile$ make 在那里,我现在在的文件夹中有干净的输出,这正是我想要的。 现在,我移至另一台计算机,并重新编译了CMake 2.8.11.2,然后我几乎回到了原来的水平!它总是将东西编译到srcmy所在的文件夹中CMakeLists.txt。 我在CMake脚本中选择目录的部分是: set(dir ${CMAKE_CURRENT_SOURCE_DIR}/../Compile/) set(EXECUTABLE_OUTPUT_PATH ${dir} CACHE PATH "Build directory" FORCE) set(LIBRARY_OUTPUT_PATH ${dir} CACHE PATH "Build directory" FORCE) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${dir}) set(CMAKE_BUILD_FILES_DIRECTORY ${dir}) set(CMAKE_BUILD_DIRECTORY ${dir}) set(CMAKE_BINARY_DIR ${dir}) SET(EXECUTABLE_OUTPUT_PATH ${dir}) SET(LIBRARY_OUTPUT_PATH ${dir}lib) SET(CMAKE_CACHEFILE_DIR ${dir}) 现在,它总是以: -- Build files have been written to: /.../src …
115 c++  build  makefile  cmake  output 

5
CMake:如何构建外部项目并包括其目标
我有一个将静态库导出为目标的项目A: install(TARGETS alib DESTINATION lib EXPORT project_a-targets) install(EXPORT project_a-targets DESTINATION lib/alib) 现在,我想将Project A用作Project B的外部项目,并包括其构建目标: ExternalProject_Add(project_a URL ...project_a.tar.gz PREFIX ${CMAKE_CURRENT_BINARY_DIR}/project_a CMAKE_ARGS -DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR> ) include(${CMAKE_CURRENT_BINARY_DIR}/lib/project_a/project_a-targets.cmake) 问题是,当运行项目B的CMakeLists时,包含文件尚不存在。 有没有办法使include依赖于正在构建的外部项目? 更新:我基于此问题和遇到的其他常见问题编写了一个简短的 CMake by Example教程。

2
向CMake添加命令行选项
我正在使用CMake构建大型图书馆,我希望用户能够选择性地启用/禁用构建过程的某些部分。 我如何在我的CMake版本中添加命令行选项,例如,以便用户可以输入类似的内容cmake --build-partone --nobuild-parttwo --dothis=true --dothat=false ..? 显然,OPTION关键字将创建可以从CMake GUI设置的变量,但是我无法从命令行中确定如何执行此操作。

6
如何使用CMake将C ++程序与Boost链接
将程序与Ubuntu下的Boost库链接时,我的CMake文件应该是什么样子? 运行期间显示的错误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} )
109 c++  boost  cmake 

3
覆盖单个文件的编译标志
我想使用一组全局标志来编译项目,这意味着在我的顶级CMakeLists.txt文件中,我指定了: ADD_DEFINITIONS ( -Wall -Weffc++ -pedantic -std=c++0x ) 但是,对于子目录中的特定文件(例如“ foo.cpp”),我想将编译标志切换为不应用-Weffc ++(包括我无法更改的商业库)。为了简化仅使用-Wall的情况,我尝试: SET_SOURCE_FILES_PROPERTIES( foo.cpp PROPERTIES COMPILE_FLAGS -Wall ) ADD_EXECUTABLE( foo foo.cpp ) ,这没有用。我也试过 SET_PROPERTY( SOURCE foo.cpp PROPERTY COMPILE_FLAGS -Wall ) ADD_EXECUTABLE( foo foo.cpp ) 和 ADD_EXECUTABLE( foo foo.cpp ) SET_TARGET_PROPERTIES( foo PROPERTIES COMPILE_FLAGS -Wall ) ,但两者都不起作用。 最后,我尝试删除此定义: REMOVE_DEFINITIONS( -Weffc++ ) ADD_EXECUTABLE( …

11
使用CMake,如何从CTest获得详细输出?
我正在使用CMake构建我的项目。我添加了一个使用Boost单元测试框架的单元测试二进制文件。这个二进制文件包含所有单元测试。我添加了要由CTest运行的二进制文件: ADD_EXECUTABLE( tftest test-main.cpp ) ENABLE_TESTING() ADD_TEST( UnitTests tftest) 但是,Visual Studio中的生成输出仅显示运行CTest的结果: Start 1: UnitTests 1/1 Test #1: UnitTests ................***Failed 0.05 sec 0% tests passed, 1 tests failed out of 1 这不是很有帮助,因为我看不到哪个测试失败。如果我从命令行手动运行ctest,--verbose我得到了Boost单元测试的输出,该输出表明实际失败的原因: 1: Test command: tftest.exe 1: Test timeout computed to be: 9.99988e+006 1: Running 4 test cases... 1: test-main.cpp(20): error …
109 cmake  ctest 

8
CMAKE中特定于操作系统的说明:如何?
我是CMAKE的初学者。下面是一个简单的cmake文件,在mingw环境窗口中效果很好。问题显然与target_link_libraries()我链接libwsock32.a的CMAKE函数有关。在Windows中,这行得通,我得到结果。 但是,正如预期的那样,在Linux中,/usr/bin/ld将查找-lwsock32Linux OS上没有的遗嘱。 我的问题是:如何指示CMAKE避免在Linux OS中链接wsock32库??? 任何帮助将不胜感激。 我的简单CMake文件: PROJECT(biourl) set (${PROJECT_NAME}_headers ./BioSocketAddress.h ./BioSocketBase.h ./BioSocketBuffer.h ./BioSocketCommon.h ./BioSocketListener.h ./BioSocketPrivate.h ./BioSocketStream.h ./BioUrl.h BioDatabase.h ) set (${PROJECT_NAME}_sources BioSocketAddress.C BioSocketBase.C BioSocketCommon.C BioSocketStream.C BioUrl.C BioDatabase.C ) add_library(${PROJECT_NAME} STATIC ${${PROJECT_NAME}_headers} ${${PROJECT_NAME}_sources} ) # linkers #find_library(ws NAMES wsock32 PATHS ${PROJECT_SOURCE_DIR} NO_SYSTEM_ENVIRONMENT_PATH NO_DEFAULT_PATH) target_link_libraries(${PROJECT_NAME} bioutils wsock32) install (TARGETS ${PROJECT_NAME} RUNTIME …
109 c++  linux  cmake  mingw  portability 

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.