After referring to stackoverflow, I use GArray as an example to demonstrate how to use glib
with CMake
. The code can be downloaded here.
Tag: CMake
Use different build system for cmake
Besides idiomatic make
, cmake
also supports other build systems (e.g., ninja
):
# cmake -h
......
Generators
The following generators are available on this platform (* marks default):
* Unix Makefiles = Generates standard UNIX makefiles.
Ninja = Generates build.ninja files.
Watcom WMake = Generates Watcom WMake makefiles.
CodeBlocks - Ninja = Generates CodeBlocks project files.
CodeBlocks - Unix Makefiles = Generates CodeBlocks project files.
CodeLite - Ninja = Generates CodeLite project files.
CodeLite - Unix Makefiles = Generates CodeLite project files.
Sublime Text 2 - Ninja = Generates Sublime Text 2 project files.
Sublime Text 2 - Unix Makefiles
= Generates Sublime Text 2 project files.
Kate - Ninja = Generates Kate project files.
Kate - Unix Makefiles = Generates Kate project files.
Eclipse CDT4 - Ninja = Generates Eclipse CDT 4.0 project files.
Eclipse CDT4 - Unix Makefiles= Generates Eclipse CDT 4.0 project files.
......
My OS
is Arch Linux
. To use ninja
, first install it:
# pacman -Syu ninja
Then specify using ninja
when executing cmake
command:
# cmake -G Ninja ..
Finally, use ninja
to build:
# ninja
Configure Boost.log in CMakeLists.txt on Arch Linux
Today, I tried to build Boost.Log
on Arch Linux
, but encountered following errors:
......
undefined reference to `boost::log::v2s_mt_posix::aux::stream_provider<char>::allocate_compound(boost::log::v2s_mt_posix::record&)'
undefined reference to `boost::log::v2s_mt_posix::aux::stream_provider<char>::release_compound(boost::log::v2s_mt_posix::aux::stream_provider<char>::stream_compound*)'
undefined reference to `boost::log::v2s_mt_posix::sources::aux::get_severity_level()'
undefined reference to `boost::log::v2s_mt_posix::aux::unhandled_exception_count()'
undefined reference to `boost::log::v2s_mt_posix::core::open_record(boost::log::v2s_mt_posix::attribute_set const&)'
undefined reference to `boost::log::v2s_mt_posix::core::push_record_move(boost::log::v2s_mt_posix::record&)'
undefined reference to `boost::log::v2s_mt_posix::trivial::logger::get()'
undefined reference to `boost::log::v2s_mt_posix::core::get_logging_enabled() const'
undefined reference to `boost::log::v2s_mt_posix::record_view::public_data::destroy(boost::log::v2s_mt_posix::record_view::public_data const*)'
......
After some investigation, I find at least on Arch Linux
, some modules need to be specified explicitly (E.g., log
) while some not (E.g., graph
). Besides, I also need claim that I want static library:
SET(Boost_USE_STATIC_LIBS ON)
FIND_PACKAGE(Boost REQUIRED COMPONENTS log)
Then use Boost_LIBRARIES
in linking executable file:
TARGET_LINK_LIBRARIES(... ${Boost_LIBRARIES})
Reference:
stackoverflow.
Define multiple exclusive macros in CMake
My program needs FOO
or BAR
macro defined, but not both. By default, FOO
is defined. Following is the snippet of CMakeList.txt
:
OPTION(BAR "BAR" OFF)
OPTION(FOO "FOO" ON)
IF(BAR)
SET(FOO OFF CACHE BOOL "Use BAR" FORCE)
MESSAGE(STATUS "Use BAR\n")
ADD_DEFINITIONS(-DBAR)
ELSE()
MESSAGE(STATUS "Use FOO\n")
ADD_DEFINITIONS(-DFOO)
ENDIF()
Notice: for simplicity, I just use the same name for macro and option variable. It may not be what you want.
Import existing CUDA project into Nsight
The steps to import an existing CUDA
project (who uses CMake
) into Nsight
are as following:
(1) Select File
-> New
-> CUDA C/C++ Project
:
Untick “Use default location
“, and select the root directory of your project.
(2) Change Build location
in Properties
to points to the Makefile
position.
(3) After building successfully, right click project: Run As
-> Local C/C++ Application
, then select which binary you want to execute.
References:
Setting Nsight to run with existing Makefile project;
How to create Eclipse project from CMake project;
How to change make location in Eclipse.