CMake提供了几种指定目标源文件的方法.一种是使用globbing(文档),例如:
FILE(GLOB MY_SRCS dir/*)
Run Code Online (Sandbox Code Playgroud)
另一个是单独指定每个文件.
哪种方式更喜欢?Globbing似乎很容易,但我听说它有一些缺点.
CMake文档说明命令文件GLOB:
我们不建议使用GLOB从源树中收集源文件列表.如果在添加或删除源时没有更改CMakeLists.txt文件,则生成的构建系统无法知道何时请求CMake重新生成.
网络中的几个讨论线程第二个是通配源文件是邪恶的.
但是,为了使构建系统知道已添加或删除了一个源,这就足够了
touch CMakeLists.txt
Run Code Online (Sandbox Code Playgroud)
对?
然后,这比编辑CMakeLists.txt插入或删除源文件名更省力.也难以记住.所以我认为没有任何充分理由提出反对意见file GLOB.
这个论点有什么问题?
该CMake的文件明确指出,file(GLOB ...)不建议收集源文件的生成,但它没有提什么建议的方法实际上是.
手动指定每个源文件听起来对我来说太过手动了.那么,收集源文件的正确方法是什么,如果没有
file(GLOB ...)?
在运行cmake命令一次以生成构建系统之后,是否应该重新运行cmake命令?
生成的构建系统可以检测相关CMakeLists.txt文件中的更改并相应地执行操作.您可以在生成的Makefile中看到这样做的逻辑.成功何时成功的确切规则对我来说是神秘的.
我应该什么时候重新开始cmake?答案取决于使用的发电机吗?
这篇博客文章(在标题下:"多次调用CMake")指出了对这个问题的困惑,并指出答案实际上是"从不",无论发生器如何,但我发现这令人惊讶.这是真的吗?
我正在尝试通过让cmake为我编译它来简化大型项目,但是我在编译boost单元测试时遇到了问题.我的简单示例的cmake文件如下所示.
cmake_minimum_required(VERSION 2.8)
find_package(Boost COMPONENTS system filesystem REQUIRED)
add_excecutable(testTheTester boostTester.cpp)
target_link_libraries(testTheTester ${Boost_FILESYSTEM_LIBRARY} ${Boost_SYSTEM_LIBRARY})
add_test(tester tester)
Run Code Online (Sandbox Code Playgroud)
而boostTester.cpp中的代码是:
#define BOOST_TEST_MAIN
#if !defined( WIN32 )
#define BOOST_TEST_DYN_LINK
#endif
#include <boost/test/unit_test.hpp>
BOOST_AUTO_TEST_CASE( la ) {
BOOST_CHECK_EQUAL(1, 1)
}
Run Code Online (Sandbox Code Playgroud)
现在这个cpp代码将编译并运行正常,如果我手动构建它:
g++ boostTester.cpp -o output -lboost_unit_test_framework
Run Code Online (Sandbox Code Playgroud)
并且cmake工作正常,但是当使用输出make文件时,make崩溃时会出现大量错误,其中第一个是:
undefined referance to 'boost::unit_test::unit_test_log_t::set_checkpoint(boost... bla bla
Run Code Online (Sandbox Code Playgroud)
现在我最初的想法是cmake没有正确链接boost库,我尝试了许多命令和组合,没有运气.有谁知道如何在cmake文件中链接boost_unit_test?
如何Boost在Clion中使用MinGW库?我已下载并解压缩boost_1_60_0.zip至C:\boost_1_60_0.我现在该怎么办?我必须安装一些东西吗?这是我的CMakeLists.txt:
cmake_minimum_required(VERSION 3.3)
project(server_client)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -s -O3")
set(CMAKE_EXE_LINKER_FLAGS -static)
set(BOOST_ROOT "C:/boost_1_60_0")
set(BOOSTROOT "C:/boost_1_60_0")
find_package(Boost 1.60.0)
if(NOT Boost_FOUND)
message(FATAL_ERROR "Could not find boost!")
endif()
set(SOURCE_FILES chat_server.cpp)
add_executable(server_client ${SOURCE_FILES})
Run Code Online (Sandbox Code Playgroud)
找不到Boost: