[CMake] Problems building a shared library
Michael Hertling
mhertling at online.de
Thu May 27 15:51:19 EDT 2010
On 05/27/2010 04:59 PM, Torri, Stephen CIV NSWCDD, W15 wrote:
> I am attempting to build a shared library as a project. In order to explain my project I will use a pseudo project with a similar setup. The library is called TruckInterface with four directories (Wheels, Engine, Frame and Truck). The directories Wheels, Engine and Frame are built as static libraries and Truck is a shared library to be installed.
>
> TruckInterface
> |------- Wheels
> |------- Engine
> |------- Frame
> |------- Truck
>
> In the CMakeLists.txt for Wheels, Engine and Frame I have followed the format below:
>
> SET ( HEADERS ..list header files )
> SET ( SOURCES ...list source files )
>
> INCLUDE_DIRECTORIES ( ...other directory to look for headers in the project... )
>
> add_library ( <name> STATIC ${SOURCES} ${HEADERS} )
In general, there's no need to specify headers in ADD_LIBRARY() or
ADD_EXECUTABLE(). Usually, this does no harm, but dependencies of
source files on headers are figured out by CMake automatically.
An exception would be if the HEADERS trigger further actions.
> In the CMakeLists.txt for Truck I have
>
> SET ( HEADERS ..list header files )
> SET ( SOURCES ...list source files )
>
> INCLUDE_DIRECTORIES ( ...other directory to look for headers in the project... )
>
> add_library ( Truck SHARED ${SOURCES} ${HEADERS} )
> link_libraries ( Wheels Engine Frame )
CMake 2.4 documentation states: "LINK_LIBRARIES: Link libraries to all
targets *added later*." Thus, Wheels, Engine and Frame are not linked
to Truck, possibly resulting in... undefined references. Furthermore,
LINK_LIBRARIES() is considered as obsolete, use TARGET_LINK_LIBRARIES()
instead.
> Now my problems that I am coming across, some of which are not cmake's fault:
>
> 1. Undefined references even though the code has been declared for member functions
Just for my understanding, "declared for member functions" means the
declaration for export to a DLL, i.e. the dllexport attribute, e.g.?
> 2. Unable to set global compiler flags in the CMakeLists in the TruckInterface directory
What have you done so far in this regard? Doesn't setting
CMAKE_C_FLAGS, CMAKE_CXX_FLAGS et al. suit your needs?
> 3. How to select when I want a debug versus a release build.
If using Make for building, set CMAKE_BUILD_TYPE to "debug", "release"
etc.; otherwise, AFAIK, the build type is chosen during the build.
Regards,
Michael
More information about the CMake
mailing list