BLT has simplified the use of CMake object libraries through the
blt_add_library macro. Object libraries are a collection of object files
that are not linked or archived into a library. They are used in other libraries
or executables through the
DEPENDS_ON macro argument. This is generally
useful for combining smaller libraries into a larger library without
the linker removing unused symbols in the larger library.
blt_add_library(NAME myObjectLibrary SOURCES source1.cpp HEADERS header1.cpp OBJECT TRUE) blt_add_exectuble(NAME helloWorld SOURCES main.cpp DEPENDS_ON myObjectLibrary)
Due to record keeping on BLT’s part to make object libraries as easy to use as possible, you need to define object libraries before you use them if you need their inheritable information to be correct.
If you are using separable CUDA compilation (relocatable device code) in your
object library, users of that library will be required to use NVCC to link their
executables - in general, only NVCC can perform the “device link” step. To remove
this restriction, you can enable the
CUDA_RESOLVE_DEVICE_SYMBOLS property on
an object library:
set_target_properties(myObjectLibrary PROPERTIES CUDA_RESOLVE_DEVICE_SYMBOLS ON)
To enable this device linking step for all libraries in your project (including object libraries), you
can set the
CMAKE_CUDA_RESOLVE_DEVICE_SYMBOLS option to
ON. This defaults the
CUDA_RESOLVE_DEVICE_SYMBOLS target property to
ON for all targets created by BLT.
You can read more about this property in the CMake documentation.
These options only apply when an object library in your project is linked later into a shared or static library, in which case a separate object file containing device symbols is created and added to the “final” library. Object libraries provided directly to users of your project will still require a device link step.
CUDA_RESOLVE_DEVICE_SYMBOLS property is also supported for static and shared libraries.
By default, it is enabled for shared libraries but disabled for static libraries.