相关疑难解决方法(0)

CMake:具有单元测试的项目结构

我正在尝试构建我的项目以包含生产源(在src子文件夹中)和测试(在test子文件夹中).我正在使用CMake来构建它.作为一个最小的例子,我有以下文件:

的CMakeLists.txt:

cmake_minimum_required (VERSION 2.8) 
project (TEST) 

add_subdirectory (src) 
add_subdirectory (test) 
Run Code Online (Sandbox Code Playgroud)

SRC /的CMakeLists.txt:

add_executable (demo main.cpp sqr.cpp) 
Run Code Online (Sandbox Code Playgroud)

SRC/sqr.h

#ifndef SQR_H
#define SQR_H
double sqr(double);    
#endif // SQR_H
Run Code Online (Sandbox Code Playgroud)

SRC/sqr.cpp

#include "sqr.h"
double sqr(double x) { return x*x; }
Run Code Online (Sandbox Code Playgroud)

src/main.cpp - 使用sqr,并不重要

测试/的CMakeLists.txt:

find_package(Boost COMPONENTS system filesystem unit_test_framework REQUIRED)

include_directories (${TEST_SOURCE_DIR}/src) 

ADD_DEFINITIONS(-DBOOST_TEST_DYN_LINK) 

add_executable (test test.cpp ${TEST_SOURCE_DIR}/src/sqr.cpp) 

target_link_libraries(test
                      ${Boost_FILESYSTEM_LIBRARY}
                      ${Boost_SYSTEM_LIBRARY}
                      ${Boost_UNIT_TEST_FRAMEWORK_LIBRARY}
                      )

enable_testing()
add_test(MyTest test)
Run Code Online (Sandbox Code Playgroud)

测试/ TEST.CPP:

#define BOOST_TEST_MODULE SqrTests
#include <boost/test/unit_test.hpp>

#include "sqr.h"

BOOST_AUTO_TEST_CASE(FailTest)
{
    BOOST_CHECK_EQUAL(5, sqr(2));
} …
Run Code Online (Sandbox Code Playgroud)

c++ boost unit-testing cmake boost-test

127
推荐指数
2
解决办法
8万
查看次数

为多个项目创建一个构建目录

我是CMake的初学者.我的环境有几个项目,如:

project
  |------ CMakeLists.txt (The main Cmake)
  |------ ProjectA
  |          |----- .cpp files
  |          |----- .hpp files
  |          |----- CMakeList.txt
  |------ ProjectB
  |          |----- .cpp files
  |          |----- .hpp files
  |          |----- CMakeList.txt
  | 
  |------ build
  |         |-----  CMakeStuff
  |------ bin
  |        |---- executables
  |------ lib
  |        |---- libwhatever.a
  |------ db 
           |---- Database stuff
Run Code Online (Sandbox Code Playgroud)

我想为每个项目使用一个构建目录,如上所示.更好的是,它可以分为多个子项目,例如build/projectA,build/ProjectB如果我需要重建一个项目,我可以删除整个build/Project文件,一切都消失了,新的Cmake将再次构建它.

我在配置CMAKE时遇到了困难.

我在项目文件夹中的原始CMakeList.txt:

cmake_minimum_required(VERSION 3.2.2.)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/../lib)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/../lib)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/../bin)

project(projectA)
set(CMAKE_BUILD_TYPE Debug)

file(GLOB SOURCES "*.cpp")

add_library(commonmessage …
Run Code Online (Sandbox Code Playgroud)

c++ makefile cmake

22
推荐指数
1
解决办法
2万
查看次数

-target选项在CMake中意味着什么?

C:\blah\duh\bin\Android>"C:\Program Files (x86)\CMake\bin\cmake.exe" --build . --target SysTest --use-stderr -- -j 8    
Run Code Online (Sandbox Code Playgroud)

我有上面的CMake构建命令.我明白了 - 建造.将从当前目录中的Makefile构建.但是选项-target SysTest和-j 8有什么作用呢?这是--build的CMake文档,但我承认我不理解--target的使用.

 --build <dir>
Build a CMake-generated project binary tree.

This abstracts a native build tool’s command-line interface with the following options:

<dir>          = Project binary directory to be built.
--target <tgt> = Build <tgt> instead of default targets.
--config <cfg> = For multi-configuration tools, choose <cfg>.
--clean-first  = Build target 'clean' first, then build.
                 (To clean only, use --target 'clean'.)
--use-stderr   = Ignored.  Behavior is …
Run Code Online (Sandbox Code Playgroud)

cmake

14
推荐指数
1
解决办法
1万
查看次数

如何创建依赖于外部头文件的cmake header-only库?

我有一个具有以下文件结构的项目:

project
 |
 |-------> lib1
 |           |----> lib1.h
 |
 |-------> lib2
 |           |----> lib2.h
 |
 |-------> main.cc
Run Code Online (Sandbox Code Playgroud)

这两个库lib1,并lib2只包含头文件,同时lib2.h包括lib1.h,和main.cc包括lib2.h.

我现在如何为这个项目编写cmake文件?我试图创建一个接口库lib2,但是编译器无法找到lib1.h.以下是我的cmake文件的内容:

lib2的CMakeLists.txt:

add_library(lib2 INTERFACE)
target_sources(lib2 INTERFACE lib2.h)
target_include_directories(lib2 INTERFACE ../lib1/lib1.h)
Run Code Online (Sandbox Code Playgroud)

整个项目的CMakeLists.txt:

add_executable(project main.cc)
target_link_libraries(project lib2)
Run Code Online (Sandbox Code Playgroud)

cmake文件中有什么问题?

c++ cmake

12
推荐指数
2
解决办法
2万
查看次数

如何在Catch2中使用CMake?

Catch2的示例中,我尝试使用cmake项目结构如下运行该示例:

/factorial
    +-- CMakeLists.txt
    +-- /bin
    +-- /include
    |     +-- catch.hpp
    |     +-- fact.hpp 
    +-- /src
    |     +-- CMakeLists.txt
    |    +-- fact.cpp
    +-- /test
         +-- CMakeLists.txt
         +-- test_fact.cpp
Run Code Online (Sandbox Code Playgroud)

fact.cpp

unsigned int factorial( unsigned int number ) {
    return number <= 1 ? number : factorial(number-1)*number;
}
Run Code Online (Sandbox Code Playgroud)

fact.hpp

#ifndef FACT_H
#define FACT_H

unsigned int factorial(unsigned int);

#endif
Run Code Online (Sandbox Code Playgroud)

test_fact.cpp

#define CATCH_CONFIG_MAIN
#include "catch.hpp"
#include "fact.hpp"

TEST_CASE( "factorials are computed", "[factorial]" ) {
    REQUIRE( factorial(1) == …
Run Code Online (Sandbox Code Playgroud)

c++ cmake catch-unit-test

5
推荐指数
2
解决办法
4639
查看次数

cmake os x failure ar没有特定的归档成员

我有一个简单的cmake项目,我无法在OS X 10.8.4上编译.cmake/make过程在Linux上运行良好但在OS XI上遇到此错误:

Linking CXX static library libImageFilter.a
ar: no archive members specified
...
make[2]: *** [lib/libImageFilter.a] Error 1
make[1]: *** [lib/CMakeFiles/ImageFilter.dir/all] Error 2
make: *** [all] Error 2
Run Code Online (Sandbox Code Playgroud)

我在两个平台上都使用Eclipse CDT4 Generator Unix MakeFile.这似乎与两个系统上的ar之间的差异有关.但是,我在谷歌找不到太多帮助我排除故障.

这里有一些更多的信息

SRC/CMakeList.txt

make_minimum_required(VERSION 2.8)
project(itkNormals)
FIND_PACKAGE (ITK REQUIRED)
IF( ITK_FOUND )
  include( ${ITK_USE_FILE} )
ENDIF( ITK_FOUND )
add_subdirectory(test)
add_subdirectory(lib)
Run Code Online (Sandbox Code Playgroud)

SRC/LIB/CMakeList.txt

add_library(DotImageFilter itkDotImageFilter.h)
SET_TARGET_PROPERTIES(DotImageFilter PROPERTIES LINKER_LANGUAGE CXX)
target_link_libraries(DotImageFilter ${ITK_LIBRARIES})

add_library(ImageFilter itkImageFilter.hxx)
SET_TARGET_PROPERTIES(ImageFilter PROPERTIES LINKER_LANGUAGE CXX)
target_link_libraries(ImageFilter ${ITK_LIBRARIES})
Run Code Online (Sandbox Code Playgroud)

的src /测试/的CMakeLists.txt:

include_directories(${PROJECT_SOURCE_DIR}/lib)

add_executable(itkNormalsMain itkNormals.cxx)
TARGET_LINK_LIBRARIES(itkNormalsMain ${ITK_LIBRARIES})
TARGET_LINK_LIBRARIES(itkNormalsMain ImageFilter) …
Run Code Online (Sandbox Code Playgroud)

c++ macos makefile cmake unix-ar

4
推荐指数
1
解决办法
3687
查看次数