相关疑难解决方法(0)

在CMake中使用GLOB或每个文件单独指定源文件是否更好?

CMake提供了几种指定目标源文件的方法.一种是使用globbing(文档),例如:

FILE(GLOB MY_SRCS dir/*)
Run Code Online (Sandbox Code Playgroud)

另一个是单独指定每个文件.

哪种方式更喜欢?Globbing似乎很容易,但我听说它有一些缺点.

cmake

145
推荐指数
4
解决办法
7万
查看次数

CMake的新人想知道什么是尘土飞扬的角落?

我做了很多项目和很多不同的构建系统和CI工具.最近,我接触到了一个偶然的挑战性任务,即为一个合理大小的C++应用程序添加基于autotools的环境.虽然我喜欢最终用户的易用性,但我并不喜欢处理m4和开发人员方面的所有auto*工具.

我在业余时间做了一个相当大的辅助项目,并且决定我想把CMake用于试驾.由于我刚刚开始,我显然正在计划挖掘文档,常见问题解答,维基等,并边做边学.顺便说一下,我为"Mastering CMake"这本书付钱,但我在亚马逊上发现的评论足以让我觉得它可能不值钱.所有这一切,在任何新的东西中都经常会出现"陷阱",新人经常会偶然发现旧的专业人士早已学会避免.我想知道那些基于人们对CMake的经验是什么,我希望通过在这里询问来减少我的学习痛苦.

我应该指出,我计划主要在Linux上构建,以及其他UN*X变体.Windows并不是我的POV真正关心的问题.这是一个大型服务器端应用程序,具有用于操作员的Web和CLI界面,用于自动化/与OSS工具集成的北向REST接口,以及用于CPE的SOAP南向接口.我将需要很多第三方库和应用程序来实现这一切,除非我想在未来10年内手动构建这一切.:)

build-process build cmake

15
推荐指数
2
解决办法
4139
查看次数

如何在CMake中更改Win32版本的可执行输出目录?

我的问题是这样的:我正在使用Visual Studio 2010开发一个小解析器.我使用CMake作为构建配置工具.

但我发现默认的可执行构建行为,不方便.我想要的是,让我的最终计划位于:

E:/parsec/bin/<exe-name>.<build-type>.exe
Run Code Online (Sandbox Code Playgroud)

而不是

E:/parsec/bin/<build-type>/<exe-name>.exe
Run Code Online (Sandbox Code Playgroud)

你会怎么用CMake做到这一点?

c++ cmake visual-studio

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

CMake:如何使用相对目录添加Boost.Test案例?

我有一个使用CMake和Boost.Test的工作项目,其目录结构如下(请原谅ASCII艺术):

+-proj
|---CMakeLists.txt
|---build
|---test
|\----dir1
|   \----foo.cpp // contains one BOOST_AUTO_TEST_SUITE and several BOOST_AUTO_TEST_CASE
|    |---bar.cpp // contains one BOOST_AUTO_TEST_SUITE and several BOOST_AUTO_TEST_CASE
 \----dir2
    \----foo.cpp // contains one BOOST_AUTO_TEST_SUITE and several BOOST_AUTO_TEST_CASE
     |---bar.cpp // contains one BOOST_AUTO_TEST_SUITE and several BOOST_AUTO_TEST_CASE
Run Code Online (Sandbox Code Playgroud)

我目前将所有源文件编译成一个可以与CTest一起运行的大型可执行文件.我的CMakeLists.txt看起来像这样:

file(GLOB_RECURSE test_cases FOLLOW_SYMLINKS "test/*.[h,c]pp")
add_executable(test_suite ${test_cases})
include_directories(${PROJECT_SOURCE_DIR} ${Boost_INCLUDE_DIRS})
target_link_libraries(test_suite ${Boost_LIBRARIES})
include(CTest)
add_test(test_runner test_suite)
Run Code Online (Sandbox Code Playgroud)

我想将每个.cpp文件编译成一个单独的可执行文件,并将其作为测试单独添加,以便我可以使用CTest正则表达式机制(特别是Boost.Test似乎没有的测试排除)来选择性地运行某些测试.但是,当CMake从dir1/dir2生成foo/bar的构建目标时,我得到名称冲突.

我的问题是:如何将整个目录树镜像test到一个类似的树下,build以便各种可执行文件之间不再存在名称冲突,以便CTest可以全部运行它们?

注意:不能在源树中重命名它们.我想foreach()对变量做一个${test_cases}(如本答案中所解释的),但我无法提取相关目录和文件名,并build/逐个文件地将它们移植到目录中.

更新:最后,我拼凑了这个脚本:

# get the test sources
file(GLOB_RECURSE …
Run Code Online (Sandbox Code Playgroud)

c++ boost cmake ctest boost-test

6
推荐指数
2
解决办法
2243
查看次数

C++代码的静态链接

我有以下问题:我使用以下类来初始化C库:

class Hello
{
public:
  Hello()
  {
    cout << "Hello world" << endl;
  }

  ~Hello()
  {
    cout << "Goodbye cruel world" << endl;
  }

} hello_inst;
Run Code Online (Sandbox Code Playgroud)

如果我将此代码包含在hello.cc文件中并将其与包含main()的另一个文件一起编译,则会在调用main()之前创建hello_inst并将其销毁.在这种情况下,它只打印一些行,在我的项目中,我通过LIBXML_TEST_VERSION初始化libxml.

我正在创建多个可执行文件,它们在cmake项目中共享许多相同的代码.根据这个线程:在CMake中添加多个可执行文件我创建了一个包含上面显示的代码的静态库,然后将可执行文件链接到该库.不幸的是,在这种情况下,永远不会创建hello_inst(并且永远不会初始化libxml2).我该如何解决这个问题?

c++ cmake static-libraries

5
推荐指数
1
解决办法
519
查看次数